2012-08-24 42 views
6

Tôi đang sử dụng lệnh dialog đáng yêu và đơn giản của jQuery để mở một hộp thoại ở phía trước một số nội dung của bên thứ ba được nhúng. Nội dung được nhúng này có thể là một trang từ bất kỳ trang web nào. Tôi CÓ THỂ làm việc này trên một số trang web (Yahoo, Google) nhưng tôi KHÔNG THỂ làm cho nó hoạt động trên các trang web khác (MSN, Johnlewis, FT).Hộp thoại jQuery qua nội dung từ một trang web khác

Tôi đã loại bỏ càng nhiều càng tốt khỏi mã bên dưới để cung cấp cho xương trần của sự cố - mã như được hiển thị hoạt động tốt và hộp thoại hiển thị. Nhưng, nhận xét dòng YAHOO và bỏ ghi chú dòng MSN, sau đó hộp thoại sẽ không hiển thị !!

<head> 
    <script src="http://code.jquery.com/jquery-latest.js"></script> 
    <script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.8.23/jquery-ui.min.js"></script> 
    <style> 
     .ui-widget-header { border: 1px solid #aaaaaa; background: #1f84f5 url(images/ui-bg_highlight-hard_75_1f84f5_1x100.png) 50% 50% repeat-x; color: #ffffff; font-weight: bold; font-size: 20pt; } 
     .ui-widget-content { border: 1px solid #aaaaaa; background: #ffffff url(images/ui-bg_flat_75_ffffff_40x100.png) 50% 50% repeat-x; color: #222222; font-size: 20pt;} 
    </style> 
     <script> 
      $(document).ready(function() { 
       $("#thedialog").dialog("destroy"); 
       $("#thedialog").dialog({height:400, width:600, modal: true, 
        buttons: {Cancel: function() {$(this).dialog("close");}} 
       }); 
      }); 
    </script> 
</head> 
<body> 
    <?php 
     // WORKING - these pages DO launch a dialog: 
     $targetlink = 'http://www.yahoo.com'; 
     // $targetlink = 'http://www.bbc.co.uk'; 
     // $targetlink = 'http://www.google.com'; 

     // NOT WORKING - these pages do NOT launch a dialog: 
     // $targetlink = 'http://www.msn.com'; 
     // $targetlink = 'http://www.johnlewis.com'; 
     // $targetlink = 'http://www.ft.com'; 

     echo file_get_contents($targetlink); 
    ?> 
    <div id="thedialog" title="Simple dialog box" style="display:none">My girl lollipop</div> 
</body> 

Điều duy nhất tôi có thể nghĩ là điều gì đó trên một trang web không hoạt động mâu thuẫn với mã của tôi - Tôi đã thử mọi thứ để bẫy lỗi nhưng không thể tìm thấy nguyên nhân nó.

Bất kỳ ai có thể giúp tôi không?

GHI CHÚ: - (1) Tôi biết ví dụ như không cần PHP, nhưng phiên bản đầy đủ hơn không (tôi chỉ tước hầu hết các mã PHP đi để giữ ví dụ này nhỏ). - (2) Tôi đang sử dụng JQuery ở nơi khác trên trang trên phiên bản đầy đủ vì vậy lý tưởng tôi muốn ở lại với JQuery, thay vì giới thiệu một khung/phương pháp thay thế.

+0

Tôi đã kiểm tra mã và có vẻ như nó hoạt động. - Tôi cần thêm chi tiết để giúp –

+0

Tôi đề nghị bạn sử dụng chrome với f12, để xem bạn có gặp lỗi trong bảng điều khiển JS hay không. để biết thêm chi tiết, tôi đã thiết lập một trang wiki về các công cụ dành cho nhà phát triển trong chrome: http://wiki.mograbi.info/developers-tools-for-web-development - bài đăng này cũng giải thích cách bẫy lỗi JS ở các mức khác nhau phương pháp. –

+0

Không có gì mở hộp thoại của bạn. Hủy bỏ "style =" display: none; "một phần của div của bạn và thêm tham số" autoOpen: true "vào hộp thoại của bạn – sdespont

Trả lời

3

[sửa] Rõ ràng nó làm việc cho một số người .. Bản thân tôi không thể có được nó để làm việc mà không có sự thay đổi dưới đây mặc dù .. [/ sửa]

Các Firebug console là hữu ích để gỡ lỗi những thứ như thế này . Trong trường hợp này, tôi nhận được $ ('# thedialog') không phải là một thông báo lỗi chức năng.

tôi nhận nó làm việc sử dụng jQuery noConflict:

<script> 
    var $j = jQuery.noConflict(); 
     $j(document).ready(function() { 
      $j("#thedialog").dialog("destroy"); 
      $j("#thedialog").dialog({height:400, width:600, modal: true, 
       buttons: {Cancel: function() {$(this).dialog("close");}} 
      }); 
    }); 
    </script> 

tôi đoán là một cái gì đó trên các trang là mâu thuẫn/trọng $, nhưng điều này dường như làm việc tốt (thử nghiệm msn.com).

Hãy xem this page để biết thêm thông tin.

+0

ĐÂY LÀ TRẢ LỜI TỐT NHẤT - Tôi sẽ 'bỏ phiếu' nếu có thể, để cho người khác biết rằng điều này đã giải quyết được, nhưng tôi mới ở đây nên nếu có ai khác có thể bỏ phiếu cho câu trả lời này tôi (để giúp người khác biết đó là một trong những giải quyết vấn đề) mà sẽ là tuyệt vời. Cảm ơn Terry - đó là một sự trợ giúp tuyệt vời - tôi đã có một cuộc xung đột có thể xảy ra - tôi thậm chí đã tình cờ gặp lệnh 'noConflict', nhưng không thể làm việc đó - bạn đã thực sự hữu ích – Steve

+0

@Steve - sẽ có thể bỏ phiếu với> 15 điểm ngay bây giờ, nhưng cũng có thể xem bài đăng của Guy mograbi, anh ấy dường như có nhiều kinh nghiệm hơn với điều này;) –

-1

Tôi đã thử mã của bạn và mã này đã hoạt động đối với tôi. Có thể bạn có một thông báo lỗi php trong nguồn được tạo ra và nó xung đột với mã JS của bạn.

Kiểm tra nguồn được tạo trong trình duyệt.

+0

Đây thực sự là một bình luận, không phải là một câu trả lời, với một đại diện nhiều hơn một chút, [bạn sẽ có thể gửi bình luận] (http://stackoverflow.com/privileges/comment) .Trong thời điểm tôi đang gắn cờ bài viết này để xóa. – Lix

+0

(không hoạt động ở đây) –

0

Bạn cần xóa mã style="display:none" nếu bạn muốn hộp thoại đó sẽ được mở tự động.

Hãy thử mã này:

<head> 
    <script src="http://code.jquery.com/jquery-latest.js"></script> 
    <script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.8.23/jquery-ui.min.js"></script> 
    <style> 
     .ui-widget-header { border: 1px solid #aaaaaa; background: #1f84f5 url(images/ui-bg_highlight-hard_75_1f84f5_1x100.png) 50% 50% repeat-x; color: #ffffff; font-weight: bold; font-size: 20pt; } 
     .ui-widget-content { border: 1px solid #aaaaaa; background: #ffffff url(images/ui-bg_flat_75_ffffff_40x100.png) 50% 50% repeat-x; color: #222222; font-size: 20pt;} 
    </style> 
    <script> 
     $(document).ready(function() { 
      $("#thedialog").dialog("destroy"); 
      $("#thedialog").dialog({height:400, width:600, modal: true, 
       buttons: {Cancel: function() {$(this).dialog("close");}} 
      }); 
    }); 
    </script> 
</head> 
<body> 
    <?php 
     $targetlink = 'http://www.yahoo.com'; 
     echo file_get_contents($targetlink); 
    ?> 
    <div id="thedialog" title="Simple dialog box">My girl lollipop</div> 
</body> 
+0

Đồng ý, bạn nói đúng (đây là một đoạn mã còn sót lại từ phiên bản đầy đủ hơn - hộp thoại được sử dụng để được kích hoạt onclick, do đó, màn hình hiển thị: không giấu nội dung hộp thoại cho đến khi onclick ocurred. Cảm ơn nhận xét) – Steve

5

mặc dù tôi đã không thể tái tạo các vấn đề về kết thúc của tôi, câu trả lời Terry Seidler là hợp lệ. Bạn sẽ gặp phải xung đột với các trang web đã có hộp thoại và JQuery.

Bạn có 2 phương pháp để tấn công vấn đề này (tôi không nghĩ rằng phương pháp 'không xung đột' sẽ làm như bạn cũng đang sử dụng plugin UI)

  1. kiểm tra nếu $ được định nghĩa và $.dialog được định nghĩa . Nếu được xác định, hãy sử dụng trang web có, nếu không hãy sử dụng dynamic loading

  2. sử dụng JS thô để thêm trình xử lý vào onload cho trang/cửa sổ và chạy một hàm. Trong hàm này, bạn nên dán mã của JQuery và JQuery-UI. Phương thức này sử dụng phạm vi của hàm để tránh các vấn đề về không gian tên.

Chỉ cần để thực hiện phương pháp 2 rõ ràng hơn, hình ảnh sau mã JS

function printMe() { alert("this will print me"); } 

function printMeToo(){ 

    function printMe(){ alert("this will print me too"); } 
    printMe(); 

} 

printMeToo(); 

Mã này nên cảnh báo "này sẽ in me too" - và chạy printMe bất cứ nơi nào khác trên trang sẽ cảnh báo "này sẽ in tôi ". Bằng cách này, bạn sẽ không làm hại các trang bạn đang tải (cũng là điều bạn nên cân nhắc) và chúng sẽ không ảnh hưởng đến bạn.

Nó trông như thế nào? Để xem cách thêm trình xử lý tải dữ liệu JS thô, bạn có thể xem this stackoverflow question. cho phép nói điều này giống như document.addEventListener('onload', function() { ... /* important stuff */ });

Điều quan trọng là chức năng này trông như thế nào? Vì vậy, đây là cấu trúc dự kiến ​​

function(){ /* important stuff function */ 

     // paste here JQuery definition code (copy paste into here...) make sure to use the minified code! 
     (function(a,b){function G(a) ... {return p})})(window); 

     // paste other plugins code as well. dialog + ... 

     .... 


     // now your code should be here, exactly like you posted it untouched 

     $("myelement"); // this uses MY JQuery version, and my JQuery-UI version and my plugins without the possibility of an override. The site cannot override my code, and I cannot override the site's code. 

} /* end of really important stuff function here */ 

Bạn muốn xem phương pháp này hoạt động và chạy? Tôi bảo vệ trang web của mình bằng Incapsula - và vì vậy chúng hiển thị con dấu của họ trên trang web của tôi (giống như hộp thoại của bạn) - xem div nổi ở dưới cùng bên phải? Họ sử dụng JQuery và các công cụ khác ở đó cũng giống như tôi chỉ định ở đây.

BTW - liên quan đến CSS - bạn có thể gặp phải vấn đề tương tự ở đó. Ví dụ: bạn tham khảo lớp .bottom - các trang web khác có thể có lớp chính xác và CSS của riêng chúng. chắc chắn rằng bạn quấn toàn bộ mã hộp thoại bằng một ID duy nhất (giống như gjkelrgjkewrl849603856903ID - và bắt đầu tất cả bộ chọn CSS của bạn với nó để tránh va chạm).

+0

Đẹp nhất! Cảm ơn lời giải thích! –

+0

Guy, cảm ơn câu trả lời - Câu trả lời của Terry đã giải quyết được vấn đề và tất cả đều đang hoạt động. Tuy nhiên, bạn có gợi ý từ câu trả lời của bạn rằng tôi vẫn có thể gặp phải các vấn đề/xung đột trong tương lai mà tôi chưa phát hiện ra, vì vậy hãy thử cách tiếp cận của bạn ngay cả khi Terry đã làm việc? Tôi đã thử những gì tôi nghĩ 'bạn có nghĩa là nhưng nó đã không làm việc (không có nghi ngờ do mã của tôi hơn là đề nghị của bạn!): 'myfunc() { $ (document) .ready (function() { $ ("#thedialog") .dialog ({height: 400, vv, vv }); \t }; vv, vv ... ' – Steve

+0

sửa câu trả lời của tôi. –

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