2014-03-14 43 views
0

我有下面的按鈕(或鏈接),我正在參與Amazon支付事件。阻止Amazon Pay Button打開彈出窗口

<a id="AmazonPayButton"></a>

的招標去如下:

var btn = OffAmazonPayments.Button("AmazonPayButton", "AmAzOnCoDeHerE", { 
     type: "PwA", color: "LightGray", 
     authorization: function() { 
     loginOptions = { scope: "profile payments:widget payments:shipping_address" }; 
     taxes = "0"; 
     authRequest = amazon.Login.authorize(loginOptions, "https://SomeIpHere.com/payment.aspx?taxes=" + taxes); 

    }, 
    onError: function (error) { 
    } 
}); 

現在有了jQuery我定義的單擊事件做一些驗證。

$("#AmazonPayButton").click(function(e){ 
    if(..) { 
     //Allow 
    } 
    else { 
     e.preventDefault(); 
     return false; 
    } 
}); 

我希望在else情況下,彈出不會開放,但仍然是的話,我怎麼能阻止它打開?

回答

0

這是一個有點猜的,因爲我從來沒有用過OffAmazonPayments.Button,但如果它也定義在按鈕上click處理程序,你在做什麼,也不會停止運行該處理程序。爲此,請確保您使用jQuery 第一個(在您爲該鏈接調用OffAmazonPayments.Button之前)連接處理程序,並在處理程序中使用e.stopImmediatePropagation()停止鏈接上的其他事件處理程序被調用。

下面是一個例子  —當前的處理程序對「停止」事件不會阻止其他處理器處於同一水平從正在運行的代碼:Live Copy

<!DOCTYPE html> 
<html> 
<head> 
<script src="http://code.jquery.com/jquery-1.11.0.min.js"></script> 
<meta charset=utf-8 /> 
<title>stopImmediatePropagation Example</title> 
</head> 
<body> 
    <div id="foo">click me</div> 
    <script> 
    (function() { 
     $("#foo").click(function(e) { 
     display("one"); 
     e.preventDefault(); 
     return false; 
     }) 
     $("#foo").click(function() { 
     display("two"); 
     }) 
     function display(msg) { 
     $("<p>").html(String(msg)).appendTo(document.body); 
     } 
    })(); 
    </script> 
</body> 
</html> 

但是如果增加e.stopImmediatePropagation();,第二個處理器已經不運行:Live Copy

<!DOCTYPE html> 
<html> 
<head> 
<script src="http://code.jquery.com/jquery-1.11.0.min.js"></script> 
<meta charset=utf-8 /> 
<title>stopImmediatePropagation Example</title> 
</head> 
<body> 
    <div id="foo">click me</div> 
    <script> 
    (function() { 
     $("#foo").click(function(e) { 
     display("one"); 
     e.preventDefault(); 
     e.stopImmediatePropagation(); 
     return false; 
     }) 
     $("#foo").click(function() { 
     display("two"); 
     }) 
     function display(msg) { 
     $("<p>").html(String(msg)).appendTo(document.body); 
     } 
    })(); 
    </script> 
</body> 
</html> 

邊n ote:如果您從jQuery事件處理函數中調用return false;,則調用e.preventDefault()是多餘的。 jQuery看到false返回值,併爲您調用e.stopPropagation()e.preventDefault()(但不是e.stopImmediatePropagation())。

+0

我知道你的答案是正確的100%,但我把招投標前/ jQuery的單擊事件,但仍然沒有運氣'後:(' –

+1

@AliBassam :-(呃,這是一個猜測,對不起,它並不是你所需要的,我會離開它一些,所以其他人可以看到它不起作用,然後刪除它;希望那時你會找到解決方案。最好的, –

0

我意識到這是一個老問題,但由於我遇到同樣的問題並在這裏遇到了這個話題,我想這個答案可能會在未來幫助其他人。

我有同樣的需要做一些驗證,並可能阻止亞馬遜付款按鈕提交和創建彈出窗口。事實證明,解決方案其實很簡單。構建按鈕時,只需將您的驗證代碼插入授權功能即可。在那裏添加你自己的函數引用時,你當然需要處理範圍,但是我將這個練習留給你。

鑑於原來的代碼片段,這裏有一個例子:

var btn = OffAmazonPayments.Button("AmazonPayButton", "AmAzOnCoDeHerE", { 
     type: "PwA", color: "LightGray", 
     authorization: function() { 
//// validation code added here 
      if (!validationCheckPasses()) { // your validation would go here 
       return; // don't allow button to submit if validation failed 
      } 
//// 
      loginOptions = 
    { scope: "profile payments:widget payments:shipping_address" }; 
      taxes = "0"; 
      authRequest = amazon.Login.authorize(loginOptions, "https://SomeIpHere.com/payment.aspx?taxes=" + taxes); 

     }, 

     onError: function (error) { 
     } 
    }); 
相關問題