2

ボタンを生成するajax関数を呼び出しています:

$html = $this->renderPartial( '/cart/_cartItem',  array( 'data'   => $data,  ) , true );

問題は、$ htmlを印刷するとボタンが表示されますが、ボタンを正しく機能させるための関連するJavaScriptが表示されないことです。このボタンを100%機能させるために必要なJavaScriptをレンダリングに強制的に含める方法はありますか?

4

3 に答える 3

1

ボタンを含めるページにJavaScriptを配置します(...は使用しないでください)。ただし、例としては、

Yii::app()->clientScript->registerScript('toggle', "

$('#clearDate').click(function() {
$('#Project_start_date').val('');
});

");

それでも機能しない場合は、JavaScriptにdocument.readyを含めてみてください

于 2013-03-25T13:23:30.667 に答える
1

私は2つのことをしてそれを修正しました:

まず、プロセス$ outputTriggerをtrueに設定して、すべてのJavaScriptを含めます。

$html = $this->renderPartial( '/cart/_cartItem',  array( 'data'   => $data,  ) , true, **true** );

第二に、これも追加していました:

<link rel="stylesheet" type="text/css" href="/easionline2/www/assets/9bdc3248/css/bootstrap-yii.css" />
<script type="text/javascript" src="/easionline2/www/assets/1dffa579/jquery.js"></script>
<script type="text/javascript" src="/easionline2/www/assets/9bdc3248/js/bootstrap.js"></script>

私はこれを取り除くためにハックをしました:

$start = strpos($html, '<div class="cartItem');
$end = strlen($html) - $start;
$html = substr($html, $start , $end );

誰かが2番目の部分を行うためのより良い方法を知っていますか?

于 2013-03-25T13:27:01.077 に答える
0

質問はすでに回答済みですが、これは関連しており、役立つ場合があります。

YiiでのAJAX呼び出しを伴うrenerPartial()に注意してください。YiiがAJAXによってもたらされた新しいビューの外側のjavascriptを正しく考慮しないことは既知のバグです。ウィジェット、またはjQueryや別のJSファイルを再ロードするものをロードする場合、AJAX呼び出しの前にページに最初にロードされたjQueryは忘れられ、それによって行われたすべての委任も忘れられます。このJSコードは、すべてのAJAX呼び出しを設定して、すでにロードされているJSファイルをロードするJSスクリプトの新しいHTMLを削除します。メインビューに配置します。

<script>
$.ajaxSetup({
global: true,
dataFilter: function(data,type){
    //  only 'text' and 'html' dataType should be filtered
    if (type && type != "html" && type != "text")
    {
                return data;
    }

    var selector = 'script[src]'; // copy-paste the following back in after [src] if you also want stylesheets blocked too: ,link[rel="stylesheet"]

        // get loaded scripts from DOM the first time we execute.
        if (!$._loadedScripts) {
        $._loadedScripts = {};
        $._dataHolder = $(document.createElement('div'));

                var loadedScripts = $(document).find(selector);

        //fetching scripts from the DOM
            for (var i = 0, len = loadedScripts.length; i < len; i++) 
        {
                    $._loadedScripts[loadedScripts[i].src] = 1;
                }
        }

    //$._dataHolder.html(data) does not work
    $._dataHolder[0].innerHTML = data;

    // iterate over new scripts and remove if source is already in DOM:
    var incomingScripts = $($._dataHolder).find(selector);
    for (var i = 0, len = incomingScripts.length; i < len; i++)
    {
        if ($._loadedScripts[incomingScripts[i].src])
        {
                    $(incomingScripts[i]).remove();
                }
                else
                {
                    $._loadedScripts[incomingScripts[i].src] = 1;
                }
        }

    return $._dataHolder[0].innerHTML;
}
});
</script>
于 2014-09-16T16:46:58.793 に答える