2011-01-10 37 views
8

Tôi đang hiển thị thành công hộp thoại mời bạn bè (mã được hiển thị bên dưới). Khi người dùng nhấp vào bỏ qua iframe/hộp thoại sẽ hiển thị một trang mới. Tuy nhiên từ thời điểm này tôi không thể tìm thấy một cách làm thế nào để đóng iframe/hộp thoại. FB.ui không trả về bất kỳ đối tượng nào, có vẻ như không phải là một phương thức Javascript SDK và duyệt qua và thao tác với DOM sẽ dễ vỡ đối với bất kỳ thay đổi mã FB nào.Cách đóng hộp thoại facebook SDK được mở bằng FB.ui()?

Bất kỳ ý tưởng nào?

function popupInviteForm(actionUrl) { 
    var fbmlString = '<fb:fbml>' + 
       ' <fb:request-form type="POST" content="Play against me in game?" action="' + actionUrl + '" method="post" >' + 
       '  <fb:multi-friend-selector target="_self" exclude_ids="" max="20" cols="4" rows="3" showborder="false" actiontext="Invite friends!" />' + 
       ' </fb:request-form>' + 
       '</fb:fbml>'; 

    FB.ui({ 
     method: 'fbml.dialog', 
     fbml: fbmlString, 
     display: 'dialog', 
     size: {width:640,height:480}, width:640, height:480 
    }); 

    $(".FB_UI_Dialog").css('width', $(window).width()*0.8); 
} 

(Lưu ý:.. Tôi đã gửi các câu hỏi tương tự trên facebook forum không có phản ứng tôi sẽ cập nhật cả hai, nên có được một câu trả lời trên một trong hai)

Các mã Javascript được chuyển thể từ một stack overflow answer.

Trả lời

5

Tôi gặp sự cố tương tự. Ngày thứ hai tìm kiếm một giải pháp. Và chỉ tìm thấy một cách: đóng hộp thoại FB hoạt động bạn nên thực hiện mã theo sau trong cửa sổ cha mẹ nơi FB JS có sẵn và nơi FB.ui được gọi là:

FB.Dialog.remove(FB.Dialog._active); 

Vì vậy, nếu bạn muốn bạn mời đóng cửa tự động thoại và không chuyển hướng đến bất kỳ trang nào khác, sử dụng các bước sau:

1) Thiết lập mục tiêu attr và là "_self":

target = "_ self"

2) tạo ra một số url callback/trang trên trang web của bạn, ví dụ https://mysite/close_dialog.html

3) Thiết attr hành động của url như vừa tạo:

action = "http: // mysite/close_dialog. html"

4) Trong close_dialog.html đặt của bạn sau đó JS:

<script type="text/javascript"> 
     if (document.location.protocol == 'https:') { 
      document.location = 'http://mysite/close_dialog.html'; 
     } else { 
      top.window.FB.Dialog.remove(top.window.FB.Dialog._active); 
     }; 
    </script> 

CẬP NHẬT:

5) Có một vấn đề khác theo cách này: FB iframe được tải bởi https, nhưng nếu yêu cầu 'hành động' attr sử dụng 'http' - người dùng sẽ nhận được cảnh báo trình duyệt. Nhưng nếu yêu cầu 'hành động' có 'https' - iframe js không thể truy cập vào phụ huynh được tải bởi 'http'. Vì vậy, nó là lý do tại sao bạn nên sử dụng hành động của 'https'

Hope this helps

Nếu bạn có giải pháp tốt hơn hoặc bạn có thể cải thiện theo cách này - xin vui lòng cho tất cả biết điều này, Thanks cho bất kỳ ý kiến ​​

+2

Tôi nhận được thông báo "Phương thức FB.Dialog.remove không được Facebook chính thức hỗ trợ và quyền truy cập vào nó sẽ sớm bị xóa". trên bàn điều khiển khi tôi sử dụng FB.Dialog.remove. Vì vậy, nó không được khuyến cáo sử dụng nó. – FR6

3

Điều đó không hiệu quả (ít nhất là không cho tôi).

Điều tôi đã làm chỉ đơn giản là gọi cửa sổ javascript.close(); chức năng thay vì top.window.FB.Dialog.remove (top.window.FB.Dialog._active); Và nó hoạt động.

<script type="text/javascript"> 
    if (document.location.protocol == 'https:') { 
     document.location = 'http://mysite/close_dialog.html'; 
    } else { 
     //alert('some message'); 
     window.close(); 
    }; 
</script> 
0

tôi tìm thấy câu trả lời Igor Reshetnikov đã làm việc, nhưng chỉ nếu tôi làm chắc chắn để tuyên bố cả hai trang - Một trong đó mở hộp thoại và close_dialog.html - như một phần của cùng một tên miền sử dụng document.domain. nên ở phía trên cùng của thẻ script trong cả hai trang you'ld phải thêm dòng này

document.domain = 'mysite.com'; 

rõ ràng là thay thế mysite.com với những gì từng miền của bạn là

0

Các FB.ui cung cấp một lựa chọn cho một chức năng gọi lại sẽ được thực hiện sau khi FB.ui hoàn tất.

FB.ui(
    { 
    method: '..........', 
    .................. 
    }, 
    function(response) { 
    //write your code here 
    } 
); 

Điều này có giúp giải quyết vấn đề của bạn không?

+0

anh ấy không cần gọi lại, anh ấy muốn đóng hộp thoại theo chương trình – luschn

0

này đóng tất cả các hộp thoại, nhưng có thể không làm việc với phiên bản tương lai do tiếp cận của nội biến _loadedNodes

if (FB && FB.UIServer && FB.UIServer._loadedNodes) { 
    var nodes = FB.UIServer._loadedNodes; 
    if (nodes) { 
    for (var item in nodes) { 
     if (nodes[item].type && nodes[item].node && nodes[item].node.close && 
nodes[item].type === "popup") { 
     nodes[item].node.close(); 
     } 
    } 
    } 
} 
0

FWIW, plugin riêng tư của trình duyệt của tôi đã ngăn chặn FB từ đóng hộp thoại. Tôi vừa tắt plugin bảo mật và hộp thoại tự đóng lại như mong đợi.

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