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

我通过做两件事来修复它:

首先,通过将进程 $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 );

有人知道做第二部分的更好方法吗?

于 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 回答