2012-04-23 51 views
6

Tôi có hai JSP khác nhau mà chương trình phụ trợ Java nối với nhau và gửi lại cho cùng một trang HTML được hiển thị.Phạm vi chức năng JavaScript giữa các thẻ tập lệnh

Mỗi JSP có <script> khối riêng của mình và xác định các chức năng bên trong khối rằng:

JSP # 1:

<script type="text/javascript"> 
    function blah() { ... } 
</script> 

JSP # 2

<script type="text/javascript"> 
    function foo() 
    { 
     blah(); 
    } 
</script> 

Giống như tôi đã nói, phụ trợ thêm chúng cho phản hồi HTTP và gửi chúng trở lại trình duyệt trong cùng một yêu cầu.

Khi tôi chạy trang này trong trình duyệt của mình, tôi có thể nói ngay rằng blah() không hoạt động khi foo() được gọi. Tôi thấy lỗi bảng điều khiển trong Firebug nêu rõ blah() không được xác định. Tôi tự hỏi nếu blah() chỉ có phạm vi bên trong thẻ <script> của riêng nó và tương tự như vậy cho foo(). Đó có phải là trường hợp ở đây, hoặc là một cái gì đó khác awry?

Khi tôi đi xem nguồn trang, tôi thấy cả khối tập lệnh và cả hai chức năng. Điều này cho tôi biết mọi thứ đang được tạo ra/trả về chính xác phía máy chủ, nhưng có lẽ cách tiếp cận của tôi vốn đã sai (xác định các hàm bên trong các thẻ script khác nhau). Cảm ơn trước.

+2

khi nào hoặc làm thế nào để bạn gọi foo()? – Philipp

+0

foo() được gọi khi người dùng di chuột qua phần tử. Tôi có thể xác minh rằng nó được gọi bằng cách thay thế nội dung của nó bằng một câu lệnh cảnh báo (""). – IAmYourFaja

Trả lời

5

tất cả đều là toàn cầu. họ có thể nhìn thấy nhau. vấn đề là khi họ được xác định và gọi cho nhau.

bạn nên xác định và gọi cho họ theo thứ tự này:

  1. thanh
  2. foo
  3. gọi foo
    • foo thực hiện và các cuộc gọi thanh
    • thanh được thực hiện
+0

Vâng, foo() được xác định bên trong tiêu đề trang và thanh() được xác định bên trong chân trang. Do đó foo() xuất hiện "cao hơn" (số dòng khôn ngoan) trong HTML kết quả hơn thanh(). Có thể rằng, vì tất cả đều được xác định trên tải trang, bởi vì foo() được xác định đầu tiên, thanh() chưa tồn tại? Trong trường hợp này, làm cách nào để buộc thanh() được xác định trước (hoặc tốt hơn, foo() đó không được gọi cho đến khi thanh() đã được định nghĩa trong khi tải trang)?!? – IAmYourFaja

+0

Ahhh, đó là một vấn đề đặt hàng. Tôi đặt thanh() trong tiêu đề trên foo() của định nghĩa và tất cả là tốt. Cảm ơn Joseph! – IAmYourFaja

0

Điều duy nhất xác định phạm vi trong JavaScript là một hàm, do đó, vấn đề của bạn không phải là vấn đề phạm vi. Bạn có thể không gọi foo(), bạn gọi nó trước khi blah() được xác định, hoặc bạn có lỗi cú pháp ở đâu đó. Có thể bạn có thể đăng toàn bộ trang HTML của mình để chúng tôi có thể xem những gì đang diễn ra.

+0

Tôi đánh giá cao ý kiến ​​của bạn, nhưng HTML thực sự là * rất lớn * và yêu cầu không phải SSCCE này ngay cả khi được * yêu cầu *. Xin vui lòng xem bình luận của tôi bên dưới câu trả lời của @ Joseph như tôi nghĩ rằng anh ấy đang đi đúng hướng. Cảm ơn một lần nữa cho tất cả sự giúp đỡ của bạn cho đến nay. – IAmYourFaja

+0

Tôi hiểu. Tôi đã đề cập đến câu trả lời của anh ta trong một trong những giải pháp khả dĩ trong câu trả lời của tôi. Thật tốt khi biết rằng bạn đã chạy nó – koenpeters

1

Bạn có thể gọi hàm như thế này:

(function($) { 

    var namespace; 
     namespace = { 
        something : function() { 
              alert('hello there!'); 
              }, 
         bodyInfo : function() { 
              alert($('body').attr('id')); 
              } 
        }; 
     window.ns = namespace; 
    })(this.jQuery); 

    $(function() { 
       ns.something(); 
       ns.bodyInfo(); 
    }); 
Các vấn đề liên quan