2008-10-06 46 views
7

Tuần trước, chúng tôi đã phát hành mã phân tích của Omniture lên một khối lượng lớn các trang web sau khi tinkering và thử nghiệm trong tuần qua.Nhận xử lý khi nghe sự kiện trong JavaScript

Trên hầu hết các mẫu trang web của chúng tôi, nó hoạt động tốt. Trong một vài tình huống không thể đoán trước được phân tán, có một sự cố làm tê liệt , trải nghiệm gặp sự cố trình duyệt rằng có thể sẽ tắt một số người dùng.

Chúng tôi không thể thấy mối quan hệ giữa các mẫu bị lỗi tại thời điểm này và trong khi có nhiều cách để khắc phục sự cố, một cách gây nhầm lẫn cho chúng tôi liên quan đến người nghe sự kiện.

Các trang web gặp sự cố khi bất kỳ liên kết nào trên các mẫu này được nhấp. Không có bất kỳ JS nội tuyến nào, và trong khi chúng tôi kích hoạt theo cách của chúng tôi thông qua các thuộc tính của HTML, chúng tôi không thể tìm thấy một vòng lặp hoặc vấn đề rõ ràng có thể gây ra điều này. (Trong khi chúng tôi khắc phục sự cố, bạn có thể trải nghiệm này cho chính mình here [cảnh báo! Cách nhấn vào bất kỳ liên kết trong trang sẽ gây ra trình duyệt của bạn một mớ rác!])

Làm thế nào để bạn xác định xem một đối tượng có một người biết lắng nghe hay không? Làm thế nào để bạn xác định điều gì sẽ kích hoạt khi sự kiện được kích hoạt?

FYI, tôi rất muốn đặt breakpoint, nhưng giữa Omnitures đang đau khổ khó hiểu và trình duyệt lặp đi lặp lại treo, tôi muốn nghiên cứu thêm triệt để làm thế nào tôi có thể tiếp cận này.

Trả lời

4

Tôi đã thực hiện "phần tử kiểm tra" trên liên kết trong trang đó bằng firebug và trong tab DOM nó cho biết có chức năng onclick (ẩn danh), và cũng có một số chức năng khác được gọi là "s_onclick_0".

tôi dỗ dành con đom đóm đặt một chiếc đồng hồ như

alert(document.links[0].onclick) 

để cảnh báo cho tôi chức năng onclick rằng Omniture (tôi đoán) gắn với liên kết:

function anonymous(e) { 
    var s = s_c_il[0], b = s.eh(this, "onclick"); 
    s.lnk = s.co(this); 
    s.t(); 
    s.lnk = 0; 
    if (b) { 
    return this[b](e); 
    } 
    return true; 
} 

Có lẽ trong cùng một cách bạn có thể xem những gì nó thực sự đang chạy sau tất cả những điều obfuscation đó.

+1

Ngoài ra: OMG! Đôi mắt của tôi! Mã obfuscation là teh sux – Victor

+0

Tôi nghĩ rằng tôi muốn thêm - Omniture * là * thêm một hàm ẩn danh vào MỌI liên kết trên một trang - như J5 chỉ ra (gián tiếp) hàm ẩn danh dựa trên mã s_code của bạn (tôi đang suy ra điều này , vì tôi gặp vấn đề tương tự, sử dụng Dojo và Omniture). – keif

1

DOM không cung cấp bất kỳ phương tiện nào để quan sát thông qua bộ sưu tập của người nghe sự kiện được liên kết với nút.

Tình huống duy nhất mà người nghe có thể được xác định là khi nó được thêm vào thông qua việc đặt thuộc tính hoặc thuộc tính trên phần tử - hãy kiểm tra thuộc tính hoặc thuộc tính onxxx.

Gần đây, có một cuộc nói chuyện trên nhóm WebAPI tại W3 về việc có thêm chức năng này hay không. Các chuyên gia dường như chống lại điều đó. Tôi chia sẻ lập luận của họ.

0

Một tập hợp các kiến ​​nghị với cơ quan thực hiện các phân tích on-page:

  • Sử dụng sự kiện tài liệu cấp chỉ chụp, đây là trong hầu hết các trường hợp (ngoài thay đổi/nộp các sự kiện) đủ

  • Đừng thực thi mã tính toán chuyên sâu (cũng như bất kỳ hoạt động IO) trong xử lý, chứ không phải trì hoãn thực hiện với một thời gian chờ

Nếu t này wo quy tắc đơn giản được xem xét, tôi đặt cược trình duyệt của bạn sẽ tồn tại

0

Trong khi đi du lịch về nhà, tôi đã đến một giải pháp cho phép tìm hiểu về sự xử lý sự kiện trên phần tử được thêm vào với AddEventListener. Chạy mã trước khi đưa mã phân tích của bạn vào. Mã không được xác minh nếu công trình, nhưng ý tưởng, tôi đoán là rõ ràng. Nó sẽ không hoạt động trong IE, tuy nhiên bạn có thể áp dụng kỹ thuật tương tự (viết lại thành viên API) ở đó.

(function(){ 
    var fAddEventListener = HTMLElement.prototype.addEventListener; 
    HTMLElement.prototype.addEventListener = function() { 
    if (!this._listeners) 
     this._listeners = []; 
    this._listeners.push(arguments); 
    fAddEventListener.apply(this, arguments); 
    } 
})(); 
0

Tôi có một số kinh nghiệm với Omniture và nhìn vào s_code.js của bạn, bạn có nhiều điều xảy ra trong "Link Tracking" khu vực, ví dụ:


/* Link Tracking Config */ 
s.trackDownloadLinks=true 
s.trackExternalLinks=true 
s.trackInlineStats=true 
s.linkDownloadFileTypes="exe,zip,wav,mp3,mov,mpg,avi,wmv,pdf,doc,docx,xls,xlsx,ppt,pptx" 
s.linkInternalFilters="javascript:,gatehousemedia.com" 
s.linkLeaveQueryString=false 
s.linkTrackVars="None" 
s.linkTrackEvents="None" 

tôi sẽ tham khảo ý kiến ​​với mọi người tại Omniture và xác minh rằng cấu hình theo dõi liên kết của bạn được thiết lập chính xác.

Cụ thể, mẫu này và các liên kết bên trong dường như thuộc về morningsun.net nhưng morningsun.net không nằm trong cài đặt s.linkInternalFilters. Nếu bạn đang sử dụng cùng một tệp s_code.js cho nhiều tên miền, bạn có thể sử dụng javascript để đặt các giá trị cấu hình cho những thứ như thế này (dựa trên document.location.hostname chẳng hạn).

Tôi không có kinh nghiệm với cấu hình theo dõi liên kết hoặc tôi sẽ cung cấp cho bạn thêm chi tiết về cách định cấu hình :)

Các vấn đề liên quan