У меня есть следующая кнопка (или ссылка), которую я ожидаю от нее в Amazon Payment Event.
<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
я определил событие click, чтобы выполнить некоторые проверки.
$("#AmazonPayButton").click(function(e){
if(..) {
//Allow
}
else {
e.preventDefault();
return false;
}
});
Я ожидаю, что в else
случае всплывающее окно не откроется, но все-таки, как я могу предотвратить его открытие?
Я понимаю, что это старый вопрос, но поскольку у меня была такая же проблема и я столкнулся с этой темой, я полагаю, что этот ответ может помочь кому-то еще в будущем.
У меня была такая же необходимость сделать некоторую проверку и, возможно, предотвратить отправку и создание всплывающего окна кнопки Amazon Payment. Решение на самом деле довольно просто, как выясняется. Просто вставьте свой код проверки в свою функцию авторизации при создании кнопки. Разумеется, вам придется иметь дело с областью, когда добавляете свои собственные ссылки на функции, но я оставляю это упражнение для вас.
Учитывая исходный фрагмент кода, вот пример:
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) {
}
});
Это немного догадка, потому что я никогда не использовал 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>
Сторона примечания: если вы return false;
из обработчика события jQuery, вызов e.preventDefault()
является избыточным. jQuery видит false
возвращаемое значение и вызывает e.stopPropagation()
и e.preventDefault()
для вас (но не e.stopImmediatePropagation()
).
:(