[英]HTML anchor tag's onclick attribute does not call javascript function
我們有一個DotNetNuke模塊在DotNetNuke 5.4.4的實例中運行,安裝在“Server A”上,這是一台帶有IIS 6.1和Internet Explorer 11的Windows Server 2008 R2 Standard機器。
我們使用Internet Explorer 9從運行Windows Server 2008 Standard的“Server B”訪問我們的DotNetNuke模塊。
當我們在服務器B上訪問我們的模塊時,單擊具有onclick
屬性的anchor html元素時會發生此問題。
onclick的錨點如下:
<a onclick='OpenWindow("/DotNetNuke/DesktopModules/Module/View.aspx?dt=%c2%b2%c2");return false;'
href="http://000.00.0.0/DotNetNuke/DesktopModules/Module/View.aspx?dt=%c2%b2%c2"
target='_blank'
jQuery1431968126278="42">Doc name (SSN-SS-SSNN)</a>
而OpenWindow函數就是這樣的
function OpenWindow(url) {
window.open(url, '', 'top=15,scrollbars=yes,menubar=no,height=800,width=800,resizable=yes,toolbar=no,location=no,status=no');
}
正如您所看到的,我們有一個帶有onclick屬性的anchor元素,它應該調用OpenWindow javascript函數,然后返回false,因此單擊一個錨點(瀏覽到href)的默認操作不會發生。
當我們單擊此鏈接時( 僅在服務器B上 ),我們沒有彈出窗口,OpenWindow函數中沒有斷點,瀏覽器通過打開一個新選項卡(View.aspx)導航到href。 這告訴我onclick屬性引用的OpenWindow函數由於某種原因甚至不運行,即使它在anchor元素上,並且可以在任何其他服務器上運行。
我比較了服務器A DotNetNuke和我的本地開發人員DotNetNuke實例之間的安全設置,web.config文件和DotNetNuke設置,發現設置沒有差異。
我將Server B Internet Explorer安全設置與我的安全設置進行了比較,發現設置沒有差異。
根據對此問題的評論建議,我嘗試將錨標記更改為span標記(刪除了href和目標屬性),我看到了相同的行為。 它適用於服務器A和開發人員,但現在不在服務器B上執行任何操作。 我認為核心問題是onclick屬性未被識別,或者被某種方式阻止。
我現在更進一步,將大部分<a>...</a>
標簽更改為<span>...</span>
標簽,使用特定的類,然后我附加jQuery(...).live('click', ...)
處理程序(使用jQuery 1.4.2)。 這是允許點擊工作,但我仍然沒有解決為什么忽略onclick屬性。
如果我打開開發人員工具(IE9),然后單擊“編輯”按鈕再次打開和關閉編輯模式,錨標簽和img標簽上的所有onclick屬性開始正常工作,直到我重新加載頁面。
如果我通過開發人員工具以任何方式手動編輯onclick處理程序,比如說刪除return false;
從onclick處理程序,它將工作,但如果我把return false;
回來讓它變得像我從未改變任何東西,它再次停止工作。
我正在找一塊牆來檢查這個問題。 我無法在我的開發人員計算機上重現它,它也適用於服務器A,所以代碼工作得非常好。 我想我必須有一個設置,我忽略了某個地方,但在哪里? 我不知道此時還有什么要檢查,我正在尋找想法。
我沒有確切的答案,但我可以給你一般的想法,了解發生了什么以及為什么。
這兩個服務器沒有得到相同的內容 - 也許它們指向不同的CDN,也許有一個舊文件的JavaScript文件 - 你必須逐個瀏覽它們。
某個地方的東西正在為所有錨標簽應用onclick處理程序。
起初我以為它是貼在身體元素上的東西,並以你的鏈接為目標,但我已經排除了這一點。 您可以編輯HTML並保存它然后鏈接工作的事實意味着您正在分離附加到該鏈接元素的任何內容。
我會:
diff
工具。 您是否嘗試直接從onclick屬性調用window.open
? 可能是在單擊鏈接時未加載該函數,因此它會產生錯誤,因此不會調用return false
,並且鏈接將繼續其默認行為(在本例中為打開選項卡)。
如果是這種情況,請查看該函數的加載順序,或嘗試將其放在代碼的不同部分(可能在onload
事件中)。
檢查您是否在Internet選項中顯示JS錯誤。
它可能有點幼稚,但由於您打開一個窗口作為彈出窗口,可能會有問題,該站點的URL可能會被阻止從瀏覽器。 如果你只是更換,它應該始終工作
window.open(url, '', 'top=15,scrollbars=yes,menubar=no,height=800,width=800,resizable=yes,toolbar=no,location=no,status=no');
同
window.open(url);
您是否嘗試將標記修改為:
<a href='javascript:MyFunction(this);' data-url='YourUrl'>Name</a>
MyFunction: function(obj) {
var element = $(obj);
window.open(element.data("YourUrl"));
}
請注意,如果用戶的瀏覽器配置為以選項卡形式打開Windows,則無法解決方法。 target =“_ blank”是我所知道的實現此目的並通過GP強制執行瀏覽器行為的最佳方式。
聽起來它不屬於您提供的代碼范圍。 你提到打開IE9 dev-tools使它工作,我建議嘗試添加console -polyfill,類似於:
if(typeof(console)=="undefined") {
var console = {
log : function() {},
error : function() {},
debug : function() {}
};
}
以防你的一些代碼將內容輸出到控制台,JS代碼在該事件之后停止工作。 可能是一些外部庫,在加載后開始向控制台輸出內容 - 由於緩存設置和/或網絡延遲,可能在不同服務器上的工作方式不同。
注意 :要正確測試,請記住在加載任何JS代碼或導入任何外部庫之前將其添加到SCRIPT標記中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.