あなたの方法がうまくいかない理由
これが機能しない実際の理由は、将来のオブジェクトの url ではなく、現在のjquery ajax オブジェクトの url プロパティを変更しているためです。これは、生成された html/js を見ると明らかです。
リンク:
<a href="#" class="bookmark_off" id="bookmark-btn">value-of-text</a>
イベント リスナー (以下は通常、最後の<script>
before</body>
にあります。いくつかのコメントも追加しました):
$('body').on('click','#bookmark-btn',function(){
jQuery.ajax({'data':{'id':1},'type':'GET',
'success':js:function(data){
if (data.status == "success"){
//attempt to dynamically change the URL
this.url = "/core/bookmark/delete";
$("#bookmark-btn").toggleClass("bookmark_on").toggleClass("bookmark_off");
}
},
'url':'/project-name/index.php/core/bookmark/create', // this url is used repeatedly
'cache':false
}); // ajax call ends
return false; // click handler ends
});
上記のリスナーは、クリックごとに新しいajax オブジェクト/呼び出しが作成/実行されることを示しています。したがって、そのオブジェクトの URL のみが変更されるたびに変更されますが、次の呼び出しのために作成される次のオブジェクトは変更されません。次の呼び出しでは、同じ古い URL、つまり : が使用されます'url':'/project-name/index.php/core/bookmark/create',
。
解決
「ajax リンクの URL を動的に変更する」方法があります。を使用する代わりにCHtml::ajaxLink
、通常の を使用しますが、CHtml::link
clientChange
オプションを追加します。clientChange
オプションは の 3 番目のパラメータ内、つまり 内に含まれCHtml::link
ますhtmlOptions
。href
このようにして、静的 URL の代わりに、ajax 呼び出し用に生成された<a>
タグの を使用する ajax 呼び出し用の動的 URL を指定できます。
例(コード内のコメントを読んでください):
echo CHtml::link($text, array('/core/bookmark/create'), array(
// the htmlOptions array, with clientOptions included
'id'=>'bookmark-btn',
'class' => 'bookmark_off',
'return' => false, // this is already false by default - read documentation
'ajax' => array( // now specify the ajax options, with a dynamic url
'url' => 'js:$(this).attr("href")', // this takes the href property of
// the <a> tag that is generated for this CHtml::link
'data' => array('id' => $id),
'custom_data_passed_to_ajax_object' => 'js:this', // this is important,
// here we pass link, <a> tag, for use within the ajax object
'success'=>'function(data){
if (data.status == "success"){
// now change the href of the <a> we passed in custom_data_passed_to_ajax_object
$(this.custom_data_passed_to_ajax_object).attr("href",
"'.$this->createUrl('/core/bookmark/delete').'");
$("#bookmark-btn").toggleClass("bookmark_on").toggleClass("bookmark_off");
}
}'
)
));
上記のソリューションを実際に次のように適応させることもできますajaxLink
。
echo CHtml::ajaxLink($text,
'js:$(this).attr("href")', // this will be generated as 'url':$(this).attr("href")
array(// ajax options, remember to pass the reference to the <a>,
// i.e custom_data_passed_to_ajax_object in the above snippet
),
array(
'href'=>$this->createUrl('/core/bookmark/create'), // your actual url
// rest of htmlOptions
)
);
「クリックごとに追加機能と削除機能を切り替えるブックマーク ボタンを実装する」という最終的な目標については、他の人がすでに十分なヒントを与えてくれています。