2013-06-17 6 views
10

Có một đoạn mã HTML:Lỗi "Chức năng được mong đợi" trong IE: '<input onclick = "start();" ... '

<input onclick="start();" type="button" value="Start!"/> 

Trong Firefox và Chrome nó gọi start trên nhấp chuột. Tuy nhiên trong IE9 nó tạo ra thông báo lỗi: SCRIPT5002: Function expected. Sau đó, tôi đã cố gắng trường hợp khác nhau:

<!DOCTYPE html> 
<html> 
<head> 
</head> 
<body> 
    <script> 
     function start(){ 
      alert("Let's start"); 
     } 
     function stop(){ 
      alert("Let's stop"); 
     } 
    </script> 
    <input onclick="start();" type="button" value="Start!"/><br/> <!-- Failed : the main issue --> 
    <span onclick="start();">Start!</span><br/> <!-- Work --> 
    <input onclick="stop();" type="button" value="Stop!"/><br/> <!-- Work --> 
    <input onclick="start();" type="text" value="Start!"/><br/> <!-- Failed --> 
    <input onmouseover="start();" type="button" value="Start!"/><br/> <!-- Failed --> 
</body> 
</html> 
  1. trường hợp gốc: Không (Đó là lý do tại sao tôi ở đây.)
  2. Sử dụng một span thay vì input: Thành công
  3. Sử dụng một tên hàm: Thành công
  4. Sử dụng loại khác: Không thành công
  5. Sử dụng onmouseover thay vì onclick: Không thành công

Tôi đã sử dụng trình gỡ lỗi và nó cho biết startfunction start(){alert("Let's start");}. Sau đó, tôi đã sử dụng alert(start) và nó cho biết fileopen.

Kết quả của thử nghiệm 3, tôi có thể dễ dàng làm việc xung quanh bằng cách thay đổi tên, nhưng tôi muốn biết tại sao lỗi này xảy ra trong một số trường hợp nhưng không xảy ra ở các trường hợp khác. Chỉnh sửa: Hoặc điều tốt nhất tiếp theo, các công việc khác xung quanh mà không thay đổi tên.

+2

trước tiên, xóa tất cả javascript khỏi html của bạn! giữ javascript của bạn trong một tập tin js. :) – Johan

+2

@Johan Trên thực tế tôi đã làm, và tôi đã nhận được lỗi, sau đó tôi đưa JavaScript vào HTML để đăng ở đây. – johnchen902

+0

Có lẽ bạn đã xác định lại biến 'start' khác với một số loại khác ngoài hàm. Nó cũng có thể là một 'id' của một phần tử HTML che khuất biến toàn cầu ban đầu. – Teemu

Trả lời

12

start là thuộc tính của input yếu tố trong IE. (. Theo Microsoft, nó chỉ ra, "when a video clip file should begin playing" Tôi không có ý tưởng gì đó có nghĩa, nhưng nó không quan trọng) Trong giao diện điều khiển của bạn, bạn có thể thấy điều này bằng cách chạy:

> document.createElement("input").start 
"fileopen" 

Trong xử lý sự kiện inline của một nguyên tố , tất cả các thuộc tính của phần tử đó đều có sẵn dưới dạng các biến cấp cao nhất. Nó giống như mã nội tuyến được chạy bên trong một khối with(thisParticularElement) (trong đó thisParticularElement là phần tử với trình nghe, rõ ràng). Do đó, trong ngữ cảnh của mã sự kiện nội dòng, biến số start đề cập đến thuộc tính start của phần tử, là một chuỗi, không phải là một hàm.

Chỉ cần thay đổi tên chức năng hoặc sử dụng window.start một cách rõ ràng.

1

điều này thật thú vị. Tôi đã thử nghiệm một vài lần của riêng tôi và có vẻ như là lỗi này xảy rabắt đầu đã là thuộc tính của phần tử đầu vào. Vì vậy, nó sẽ cố gắng gọi tài sản, không phải là chức năng.

Tôi coi đó là lỗi.

Hãy thử đoạn mã sau:

<script> 
     function autocomplete(){ 
      alert(""); 
     } 
     function vspace(){ 
      alert(""); 
     } 
     function hspace(){ 
      alert(""); 
     } 


    </script> 

<input id="error" onclick="autocomplete();" type="button" value="Start!"/> 
<input id="error2" onclick="vspace();" type="button" value="Start!"/> 
<input id="error3" onclick="hspace();" type="button" value="Start!"/> 

Sau đó cố gắng gỡ lỗi trong giao diện điều khiển. Ngoài ra hãy thử var x = document.getElementById("error"); và sau đó gỡ lỗi x thuộc tính.

Tôi đã thử nghiệm điều này trong IE8, IE9 và IE10. Các chức năng này không hoạt động trong IE9 và IE10 của tôi (Win 7 32bit).

+0

apsillers nhanh hơn: P –