2011-10-27 6 views
5

Tôi đã cố gắng thiết lập trang thử nghiệm này cho trò chơi flash của mình nhưng nó từ chối tập trung vào tải. Tôi đọc một loạt các mục diễn đàn và không nhận được nó để làm bất cứ điều gì, tôi không thể thực sự tin rằng điều này nên khó khăn như vậy.Làm cách nào để khiến đối tượng flash của tôi tập trung vào tải?

Dưới đây là những gì tôi có:

<head> 
<title>UP HERE WE ESCAPE THE RAT RACE</title> 
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> 
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/swfobject/2.2/swfobject.js"></script> 
<script type="text/javascript"> 
    swfobject.embedSWF("UpHere.swf", "myContent", "700", "300", "9.0.0"); 

    function setFocusOnFlash() { 
    var fl = document.getElementById("myContent"); 
     if (fl) { fl.focus(); } 
    } 
</script> 
    </head> 
    <body onload="setFocusOnFlash()"> 
    <div style="margin:0 auto; text-align:center; width:700px;"> 
    <div id="myContent" style="margin:0 auto; text-align:center; width:700px;"> 
     <p>Alternative content</p> 
    </div> 
    </div> 
     </body> 

Bạn có thể nhìn thấy nó sống ở đây, http://joon.be/exclusivepreview/

gì sai với nó? Tôi không có kiến ​​thức sâu về swfObject ...

Trả lời

6

Tôi đã tìm thấy một cách phù hợp với mình trên Firefox 16, Chrome 23 và IE 8 (đây là nơi tôi đã thử nghiệm nó cho đến nay). Tất nhiên, đây là một loạt các hacks để biết nếu nó sẽ làm việc mãi mãi ... nhưng nó chắc chắn không làm cho mọi việc tồi tệ hơn.

function setFocusOnFlash() {  
    var flash = document.getElementById("theIdOfTheObjectElement"); 
    flash.tabIndex = 1234; // This was needed on Chrome 23 
    flash.focus(); 
    // Attention: FireFox needs wmode "opaque"! 
} 

Trên Firefox chỉ, <param name="wmode" value="opaque"> dưới các yếu tố object cũng là cần thiết, nếu không focus() không có hiệu lực. (Tôi đã sử dụng số jquery.flash của Stephen Belanger, nơi bạn có thể chỉ định wmode; Tôi cho rằng nó cũng có thể với SWFObject.)

Nhưng phần phức tạp hơn là bạn không được gọi setFocusOnFlash quá sớm. Đối với Chrome và IE, việc thêm setTimeout(setFocusOnFlash, 1) trực tiếp sau khi JavaScript chèn đối tượng đã hoạt động. Trực tiếp phát hành setFocusOnFlash() không. Tôi cho rằng mẹo này chỉ đơn giản là các callbacks theo thời gian chỉ được gọi sau khi trình duyệt đã xử lý hoàn toàn thay đổi tài liệu, bất kể độ trễ bạn chỉ định. Nhưng trên Firefox gọi với sự chậm trễ nhỏ này là quá sớm; nó đã đặt một đường viền chấm xung quanh phần tử object (không nên) và Flash không nhận được nét chính. Việc đặt độ trễ là 250 đã khắc phục sự cố này trên máy tính của tôi, nhưng ai biết được bạn cần sự chậm trễ lớn như thế nào. (Tệ hơn nữa, lặp lại các cuộc gọi setFocusOnFlash không giúp được gì ... một khi đường viền chấm chấm đó ở đó, chúng không còn hiệu lực nữa.) Vì vậy, thay vào đó, tôi đã thêm một gọi lại ExternalInterface.call("flashLoaded") vào hàm tạo flash lớp tài liệu. Để rõ ràng, bạn làm điều đó trong Flash/ActionScript, vì vậy bạn cần truy cập vào nguồn hoặc tác giả của tệp SWF. Bằng cách này, khi SWF bắt đầu, nó gọi phương thức JavaScript flashLoaded của trang nhúng HTML, vì vậy bạn biết nó đã sẵn sàng. Chức năng giống như:

function flashLoaded() { 
    // Oddly, directly calling setFocusOnFlash() didn't work on IE8 
    setTimeout(setFocusOnFlash, 1); 
} 
0

Phương pháp bạn đang sử dụng sẽ chỉ hoạt động với Internet Explorer - đó là hạn chế của cách flash được sử dụng.

http://kb2.adobe.com/cps/155/tn_15586.html

+0

và có phương pháp nào để thực hiện việc này với Chrome và các trình duyệt khác hay flash tự động lấy nét không chỉ là suy nghĩ bạn nên/có thể làm? – joon

+0

Có thể có một cách để làm điều đó, nhưng tôi chắc chắn chưa tìm ra. –

1

Cách để làm điều này là sử dụng ExternalInterface và gửi tập trung sang Flash sử dụng một người biết lắng nghe JS trên các sự kiện tab (ví dụ như tab di chuyển ra khỏi thành phần trước khi Flash). Trong thực tế nó là khó khăn và xử lý stage.focus trong AS của bạn cần phải đối phó với một số, erm, quirks. Nhưng nó hoạt động khá nhiều trình duyệt chéo

0

Tôi đã tuyệt vọng tìm kiếm để có được công việc này, chỉ cần để tăng tốc độ của riêng phát triển Flash trò chơi của tôi để tránh phải bấm mỗi lần duy nhất để kiểm tra trò chơi của tôi. Vì vậy, tôi không quan tâm nếu nó hoạt động trong tất cả các trình duyệt, vì vậy đây là một trong những công trình chỉ trên Chrome.

<body onload='document.getElementById("haxe").focus();'> 
    <embed src="game.swf" id="haxe" ... 

Nếu bạn đã thử tập trung() trước và nó không làm việc cho bạn, lưu ý rằng bạn phải sử dụng chỉ là nhúng thẻ, không phải là phiên bản đối tượng và param.

Đã thử nghiệm trên phiên bản Chrome 40.0.2214.93 (64 bit).