我正在调用一个生成按钮的 ajax 函数:
$html = $this->renderPartial( '/cart/_cartItem', array( 'data' => $data, ) , true );
问题是,如果我打印出 $html,我会看到按钮,但是使按钮正常工作的相关 javascript 不存在。有没有办法强制渲染包含使该按钮 100% 工作的必要 javascript?
将 javascript 放在包含按钮的页面上(不要使用 ...),但例如;
Yii::app()->clientScript->registerScript('toggle', "
$('#clearDate').click(function() {
$('#Project_start_date').val('');
});
");
如果它仍然无法正常工作,请尝试在 javascript 中包含 document.ready
我通过做两件事来修复它:
首先,通过将进程 $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 );
有人知道做第二部分的更好方法吗?
这个问题已经回答了,但这是相关的,可能会派上用场。
请注意在 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>