對於通過AJAX動態添加元素或任何之後的頁面加載,我知道我們必須使用.on
像jQuery的事件不觸發(高級)
$(document).on('click', '#dynamically-added-element', function() {
// do something
console.log('Hello World!');
});
我甚至包礦用(function($){})(jQuery);
,以確保沒有衝突;並確保一切應按正確的順序運行/加載,我也有$(document).ready(function(){});
。
現在原本意味着事件對Page A
運行,它工作得很好,但是當我提出和嘗試在具有主容器相同id
Page B
運行,並具有相同的子html,這是行不通的。
所以我做了一些實驗/測試,兩者都有效。 (1)所以我做了什麼,我通過我的瀏覽器的控制檯編寫了完全相同的事件監聽器,只需要console.log
,然後單擊目標元素,它就可以工作! (2)在同樣的.js
腳本中,我添加了與console.log
完全相同的事件偵聽器,但將其封裝在setTimeout(function(){}, 5000);
之內,5秒後,我單擊目標元素並且它工作正常!
所以我現在的問題是,爲什麼我的原始代碼不起作用?爲什麼這些測試有效?那麼解決方案是什麼?
另外,我的html元素沒有動態加載,它在頁面加載時加載,通過服務器端PHP
生成。
編輯: 此信息可能會有幫助。
- 在Magento運行
- JS腳本被包括在
head
(這就是爲什麼$(document).ready
是非常重要的)。 - jquery腳本正在我的自定義腳本之前加載。
- 頁面A和頁面B位於不同頁面上。
- 它不是一個ajax生成的元素,也不是js/jquery添加的元素;它生成回發
php
代碼
(3)我的第三個實驗也適用。但我不希望這是我的解決方案,如果可能的話,也不使用JavaScript內聯onclick
。所以我做了什麼,我在php
文件中添加了一個全新的腳本塊,其中包含頁面的「部分」,代碼完全相同,並且工作正常。但事情是,我現在有兩個相同的事件監聽器。
因此,現在我有2個相同的事件監聽器(無論另一個不工作 - 僅用於頁面B),1從內部(內部)和1從外部.js
文件。
<script type="text/javascript">
(function($) {
$(document).ready(function() {
$(document).on('click', '#the-container a', function(e) {
e.preventDefault();
var target = $(this).attr('href');
});
});
})(jQuery);
</script>
u使用jQuery的跡象,在第二美元$ ...查看控制檯錯誤 –
'(函數($){})(jQuery的);'= ==''jQuery(document).ready(function(){});' –
@IvanKaraman在我的第一個例子中,我通過控制檯使用'''jQuery''',因爲我知道''''''' '不起作用。另外,沒有錯誤。 – Miguel