2015-10-19 75 views
0

我正在使用jQuery,我試圖在點擊函數中爲不同的鏈接添加一個點擊觸發器。繼承人我有什麼:未捕獲RangeError:超出最大調用堆棧大小 - jQuery錯誤

$('.details .banner .banner_link').on("click", function(e){ 
      e.stopPropagation(); 
      e.preventDefault(); 

      $('a.banner_link').trigger("click"); 
     }); 

正如你所看到的,我使用stopProp和PreventDef,但我仍然得到:

Uncaught RangeError: Maximum call stack size exceeded 

這是推動我瘋了,我一直停留在此一而請任何幫助,或至少爲什麼發生這種情況?!

背景:上述

.banner_link和a.banner_link在代碼是在同一頁上兩個獨立的鏈路。我將a.banner_link的html添加到頁面上,並通過js將它添加到單獨的位置以顯示相同的鏈接。

我想模擬新創建的鏈接中的原始鏈接的行爲(它會導致模式彈出),因此我正在使用觸發器(「單擊」)功能執行此操作。

注:

如果我只是運行觸發器(「點擊」)外點擊功能範圍之外,它運行良好!

+1

[遞歸]的範圍之內(https://en.wikipedia.org/wiki/Recursion)。 – VisioN

+0

您需要在觸發點擊之前禁用您的處理程序。就目前而言,你的處理程序自稱是無限的。 – CollinD

+1

您明確調用「click」,因此點擊被重新調用ad infinitum;它與默認行爲無關...... –

回答

0

這是一個無限循環,因爲

$('a.banner_link').trigger("click"); 

將再次等呼的一下處理程序。 由於「點擊」不是真實事件,因此e.stopPropagation();將不起作用(因爲實際點擊已經停止傳播)。

你可以使用一個狀態變量來停止

$('.details .banner .banner_link').on("click", function(e){ 
     if ($(this).clickstate) 
      return: 

     e.stopPropagation(); 
     e.preventDefault(); 

     $(this).clickstate = true; 
     $('a.banner_link').trigger("click"); 
    }); 

更智能的方式從而會改變選擇:

$('.details .banner a.banner_link').on("click", function(e){ 

      // do what needs to be done ... 


    }); 

另一種方法是將封裝內的點擊處理函數a.banner_link中的函數和調用如下函數:

function aClick() { 
    ... 
    } 

    $('.details .banner .banner_link').on("click", function(e){ 
     e.stopPropagation(); 
     e.preventDefault(); 

     aClick(); 
    }); 


    $('a.banner_link').on("click", function(e){ 
     aClick(); 
    }); 
+0

觸發器選擇器是a.banner_link,所以你的選擇器不能像其在類中使用.banner_link元素尋找錨標記一樣,除非這是一個錯字?:-) –

+0

@StevenBrookes如果選擇器在觸發器,它將作爲一個選擇無論如何 - 沒有得到你的觀點tbh ... –

+0

@StevenBrookes採取了一個詭計,明白了。將進行編輯。謝謝! –

0

因爲鏈接有一個點擊事件綁定到它,所以當你移動鏈接並觸發點擊時,點擊事件會再次觸發,這又會觸發永久點擊觸發器。

爲什麼你需要手動觸發點擊事件?如果您的模態對話框顯示邏輯位於某個功能中,只需執行該功能的點擊事件調用即可。如果它不在一個單獨的功能,它應該是。

stopPropagation和的preventDefault將停止事件傳播了樹,分別阻止了click事件的默認操作,但調用觸發「點擊」按鈕再次是那些功能

相關問題