2012-05-04 37 views
5

Tôi đang làm việc trên tập lệnh Greasemonkey để biến một số văn bản thành liên kết trên trang a Rally. Tập lệnh hoạt động tốt chỉ khi tôi tải lại trang. Nếu tôi điều hướng đến trang theo bất kỳ cách nào (liên kết, trình duyệt chuyển tiếp/quay lại) tập lệnh không chạy, mặc dù thực tế trình đơn Greasemonkey hiển thị tập lệnh của tôi ở dưới cùng, với dấu kiểm.Tập lệnh Greasemonkey chỉ chạy khi trang được tải lại

Dưới đây là một URL ví dụ:

https://rally1.rallydev.com/#/4745909548/detail/userstory/6138899084/changesets 

khớp My quy tắc:

/^https://.*\.rallydev\.com/.*/changesets$/ 

Tôi không biết nếu băm đang gây ra một vấn đề, nhưng mọi thứ đều tốt khi tôi tải lại.

Không chắc chắn nên đi đâu từ đây. Bất kỳ trợ giúp được đánh giá cao.

+1

Nếu nó hoạt động khi tải lại thì tôi nghi ngờ liệu kết hợp có quan trọng không ... –

+0

Đồng ý, tôi đã bao gồm thông tin đó vì tôi đã tìm một người nào đó sẽ hỏi. :) – neilw

Trả lời

7

Không thể chắc chắn điều gì đang diễn ra, bởi vì (các) trang mục tiêu nằm sau tường trả tiền và cơ chế "Dùng thử miễn phí" bị cáo buộc thổi khối.

Dưới đây là một số nguyên nhân có thể của hành vi hiện tại:

  1. Các yêu cầu ban đầu là không an toàn (http) nhưng chuyển hướng đến một trang an toàn (https).
  2. Tải trang đầu tiên thực hiện một số loại chuyển hướng khác đến trang thực tế.
  3. Nội dung mục tiêu nằm trong một số không tải ngay lập tức.
  4. Nội dung mục tiêu được AJAX-in.
  5. Điều gì đó kỳ lạ mà chúng tôi sẽ cần phải xem trang thực tế để tìm ra.
  6. URL ban đầu không thực sự kết thúc bằng changesets.

Ngoài ra, nhận được vào các thói quen thoát khỏi / s trong giữa của biểu thức thông thường. Nó không phải lúc nào cũng cần thiết, nhưng nó cuối cùng sẽ cắn bạn trong [bị kiểm duyệt] nếu bạn không. Vì vậy, tập lệnh nên sử dụng:

// @include /^https:\/\/.*\.rallydev\.com\/.*\/changesets$/ 

để bắt đầu, nhưng xem bên dưới.


bước để có một giải pháp:

  1. Thay đổi @include của bạn để chiếm http và Khả năng trailing không gian hoặc trailing slash trong URL. Sử dụng:

    // @include /^https?:\/\/.*\.rallydev\.com\/.*\/changesets(?:\s|\/)*$/ 
    
  2. Kiểm tra trang với Firebug. Là nội dung AJAXed-in? Có phải trong một số không? Nếu có, URL iframe là gì, nếu có?
  3. Để cũng phát hiện AJAX và/hoặc chuyển hướng, hãy sử dụng Firebug's Net panel và/hoặc Wireshark.
  4. Nếu có thể, hãy cung cấp cho chúng tôi bằng chứng xác thực đăng nhập để chúng tôi có thể thấy trang có vấn đề.
  5. Chụp nhanh trang có vấn đề (Lưu trang qua Firefox) và liên kết đến HTML và JS đó trong Pastebin.com.
  6. Xem xét sử dụng mã như:

    if (window.top != window.self) { 
        //--- Don't run on/in frames or iframes. 
        return; 
    } 
    

    Để có kịch bản chỉ chạy trong (hoặc không) iframe, nếu có.


Nếu vấn đề là do sự chậm trễ AJAX (hoặc tải nội dung mới), được xung quanh đó bằng cách sử dụng the waitForKeyElements() utility như trong "Fire Greasemonkey script on AJAX request".

+1

Điều này rất hữu ích, cảm ơn bạn rất nhiều. Đó là một vấn đề AJAX, mặc dù tôi đã bị lừa ban đầu bởi cách các liên kết được cấu hình trên trang. Tôi đã thử sử dụng waitForKeyElements(), áp dụng quy tắc cho toàn bộ miền và có vẻ như nó đang hoạt động. Đó là một chút nặng (muốn tôi không cần phải tải jQuery), nhưng nó hoạt động và có vẻ là đáng tin cậy. Cảm ơn nhiều lắm. – neilw

+1

Bạn được chào đón. Tôi đã từng nghĩ đến việc tạo ra một 'waitForKeyElements' không yêu cầu jQuery, nhưng tất cả, nhưng kịch bản lệnh đơn giản nhất của tôi vẫn sử dụng jQuery. Nó không phải là nặng, đặc biệt là kể từ khi GM chạy nó ra khỏi máy địa phương của bạn khi bạn sử dụng '@ require' chỉ thị. Và sự tuyệt vời tuyệt vời của jQuery làm cho việc viết kịch bản trở nên dễ dàng hơn nhiều. –

+1

Cảm ơn rất nhiều đến tất cả những người liên quan. Tôi đang làm việc với quá trình thanh toán của Amazon và tôi đã không nhận ra nó lúc đầu, nhưng họ đang AJAX tải mỗi "trang" và thay đổi URL thông qua 'window.location.pathname'. Tôi đã cập nhật tập lệnh của mình thành @include bất kỳ trang nào trong quá trình và dễ dàng chuyển đổi nó thành sử dụng 'waitForKeyElements'. Đó là một giải pháp 3 phút cho những gì sẽ có được một cơn ác mộng gỡ lỗi lớn. –

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