jquery 1.9.1 を使用した次の JavaScript コードがあります。
(function ($) {
$(function () {
eventTracking();
});
function eventTracking() {
$("[data-formtracking]").bind('submit', function (e) {
e.preventDefault();
var eventName = $(this).data("formtracking");
rt.trackEvent(eventName);
$(this).unbind('submit').submit();
});
}})(jQuery);
ここで、フォームを送信すると、データベースが更新され、フォーム上のアクションに従って、基本的に別のページにリダイレクトされます。
Chrome/IE では rt.trackEvent が正常に起動し、他のサイトにリダイレクトされます。Firefox では、別のサイトにリダイレクトされますが、データベース エントリはありません。
各ステートメントの間に console.log を追加すると、すべてのログ ステートメントにヒットしていることがわかります。
だからこの時点で....私は困惑しています。バインドからオン/オフに切り替えてみました。私は試しました: $('input[type=submit]', this).click() 別のスタックオーバーフローページでコメントを渡すことに基づいています。
いくつかの注意事項: * rt は外部ファイルにあります。確認しましたが、存在します * unbind.submit を削除すると、rt.trackEvent は正しく機能しますが、ページが (明らかに) リダイレクトされません。* unbind.submit() を他のバリエーションに変更しましたが、送信する前にボタンを 2 回クリックする必要があります。
考え?
更新しました
e.preventDefault() 以降の送信の理由は、フォームの送信が速すぎたためです。rt.trackEvent が正しく機能する前に、ページがリダイレクトされます。そのため、 setTimeout($(this).unbind('submit').submit(), 2000); を追加してメソッドの速度を落とす必要がありました。
コードを簡素化するためにこれを削除しましたが、コードの動作には非常に重要です。
更新された 2 呼び出されている json は次のとおりです。
options = $.extend({ success: $.noop, error: $.noop, urlBuilder: getNoCookieRequestURL, eventName: null }, options);
options.url = options.urlBuilder(options.url, options.siteId, options.eventName);
$.getJSON(options.url, function (jsonp) {
options.success(jsonp);
}).fail(function () {
options.error();
});
更新 3
getJson を次のように変更します。
options = $.extend({ success: $.noop, error: $.noop, urlBuilder: getNoCookieRequestURL, eventName: null }, options);
options.url = options.urlBuilder(options.url, options.siteId, options.eventName);
$.ajax({
url: options.url,
dataType: 'json',
async: false,
success: function (jsonp) {
options.success(jsonp);
},
error: function() {
options.error();
}
});
私はまだ速度の問題を抱えているようです。コードは Chrome でステップ実行すると機能しますが、実行しただけではデータベースが適切に更新されません。