ボタンを生成する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を含めてみてください
私は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番目の部分を行うためのより良い方法を知っていますか?
質問はすでに回答済みですが、これは関連しており、役立つ場合があります。
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>