2011-12-05 32 views
5

Tôi đã yêu cầu How can I make the “Preview Post” button save and preview in the same window? trên Exchange Stack của Wordpress, nhưng đây có thể là một câu hỏi tốt hơn cho Stack Overflow vì nó liên quan trực tiếp hơn đến mã hóa.Làm cách nào để liên kết Wordpress 'Preview' mở trong cùng một cửa sổ?

Wordpress có một hộp thoại mà cho phép bạn lưu, xem trước, và công bố đăng tải trên blog của bạn:

Picture.png http://img854.imageshack.us/img854/7986/picturek.png

Các "Preview" nút thực sự là một liên kết kiểu như một nút:

<a tabindex="4" id="post-preview" target="wp-preview" 
href="/?p=67&amp;preview=true" class="preview button">Preview</a> 

Vấn đề của tôi là tôi dường như không thể tìm ra cách để mở liên kết đó trong cửa sổ hiện tại. Hãy chú ý đến phần target="wp-preview". Tôi đang cố gắng loại bỏ phần đó, nhưng tôi nghĩ có thể có một hàm khác liên kết với phần tử đó bởi vì tôi thực sự không thể mở nó trong tab/cửa sổ hiện tại, ngay cả sau khi hủy liên kết và xóa thuộc tính target.

Tôi đang chạy mã sau đây như một phần của plugin (bạn có thể xem thêm thông tin về cách chạy plugin này dưới dạng plugin), nhưng cũng có thể sao chép và dán mã này vào Chrome hoặc bảng điều khiển của Firefox để kiểm tra điều này ra cho mình mà không cần sửa đổi Wordpress. Xin lưu ý rằng khi thử nghiệm, bạn cần phải sử dụng jQuery thay vì $ trong các chức năng của riêng mình khi Wordpress sử dụng phương thức noconflict, tuy nhiên, mã bên dưới hoạt động tốt.

//select the node and cache the selection into a variable 
var $node = jQuery('a.preview'); 

//add a 1px dotted outline to show we have the right element 
$node.css('outline','1px dotted red'); 

//show current target 
console.log($node.prop('target')); 
//show if anything is bound - nothing is for me ('undefined') 
console.log($node.data('events')); 

//remove anything bound to it 
$node.unbind(); 
//set target to _self (current window), just in case 
$node.prop('target','_self'); 
//the remove the target attribute all together 
$node.removeAttr('target'); 

//clone the node 
var $clone = $node.clone(); 
//change the text to new 
$clone.text('new'); 
//remove target from clone 
$clone.removeAttr('target'); 
//unbind the clone 
$clone.unbind(); 
//insert the clone after the original node 
$node.after($clone); 

//show current target - now shows undefined for me 
console.log($node.prop('target')); 
//show if anything is bound - still 'undefined' 
console.log($node.data('events')); 

Đây là cách bạn có thể làm việc mã vào một chủ đề hoặc plugin:

// set up an action to set a function to run in the wp admin_footer 
add_action('admin_footer','my_admin_footer_script',9999); 

Dưới đây là các chức năng có thêm các javascript:

//this function can then be used to add javascript code to the footer 

function my_admin_footer_script(){ ?> 
    <script type="text/javascript"> 
    jQuery(function($){ 
    (above js code here) 
    }); 
    </script> 


    <?php 
} 

Đây là kết quả tôi kết thúc với. Nếu tôi nhấp vào liên kết "kiểm tra" nó sẽ mở trong cùng một cửa sổ. Nếu tôi nhấp vào liên kết Xem trước, nó vẫn mở trong một tab mới.

Picture.png http://img832.imageshack.us/img832/4163/picturesf.png

ps: Tôi đang sử dụng phương pháp này từ Things you may not know about jQuery để kiểm tra các sự kiện ràng buộc, và tôi đã không tìm thấy bất cứ điều gì ràng buộc, và tôi tin Wordpress chủ yếu sử dụng jQuery vì vậy tôi không nghĩ rằng đây sẽ là ràng buộc với một trình xử lý sự kiện khác.

+0

Nếu họ đang sử dụng ủy quyền sự kiện, bạn sẽ không thể sử dụng thủ thuật dữ liệu ('sự kiện'). Tôi cũng nghĩ rằng các phiên bản mới hơn của jQuery có thể đã loại bỏ điều đó. –

+0

Nhưng unbind vẫn nên làm việc vì nó là một chức năng bản địa, phải không? Mỗi tài liệu jQuery: '$ ('# foo'). Unbind(); // Phiên bản này loại bỏ các trình xử lý bất kể loại nào.' – cwd

+1

Bỏ liên kết sẽ không hoạt động nếu họ đã sử dụng đại biểu, vì thực sự không có sự kiện nào được liên kết với phần tử đó. Cách thức hoạt động của đại biểu là họ lắng nghe các sự kiện cao hơn trong DOM và sau đó thẩm vấn đối tượng sự kiện để xem nó đến từ đâu. Nếu bạn có thể tìm ra yếu tố nào mà sự kiện bị ràng buộc, bạn có thể sử dụng undelegate. Dù sao, đây hoàn toàn là phỏng đoán về phía tôi. Tôi không biết chắc chắn rằng họ thậm chí còn sử dụng đại biểu. –

Trả lời

3

Bạn có thể thử này:

jQuery('.preview.button').click(function(e){ 
    window.location.href = this.href; 
    return false; 
}); 

trình từ Thanh tra Chrome.

+0

Làm việc cho tôi. Nice one Kennis – mrtsherman

+0

Cảm ơn bạn. Đây là một giải pháp thú vị, có vẻ như một chút hack, nhưng nó hoạt động và nó trả lời câu hỏi mà tôi đã đăng. Bằng cách nào đó mặc dù tôi vẫn rất quan tâm đến việc biết lý do tại sao các phương pháp tiêu chuẩn không hoạt động, và làm thế nào để tìm người nghe sự kiện được ủy quyền. – cwd

+0

Chỉ cần thử với một phiên bản khác của Google Chrome và nó xuất hiện là 'jQuery ('. Preview.button'). Unbind(). RemoveAttr ('target')' hiện đang hoạt động ... – cwd

1

Cú pháp là đúng nhưng thời gian là quan trọng. Nếu bạn chỉ làm phần đầu tiên nhưng không phải phần thứ hai thì có thể điều này sẽ không hoạt động vì có vẻ như có sự chậm trễ với sự kiện liên kết với phần tử này.

Nếu bạn bao gồm phần thứ hai, chờ 500ms sau khi trang được tải để chạy, có vẻ như nó hoạt động như mong đợi.

add_action('admin_footer','preview_same_window'); 

function preview_same_window(){ ?> 
    <script type="text/javascript"> 

    jQuery(function($){ 

     //first part 
     jQuery('.preview.button').unbind().removeAttr('target'); 

     //second part 
     setTimeout(function(){ 
     jQuery('.preview.button').unbind().removeAttr('target'); 
     },500); 


    }); 

    </script> 
    <?php 
} 
Các vấn đề liên quan