2012-08-28 35 views
7

Thẻ tập lệnh đơn giản bên trong thẻ body dường như không hoạt động. Thông báo không được kích hoạt trong mã bên dưới:Thẻ Meteor.js: <script> không hoạt động bên trong <body>

<body> 
    <script type="text/javascript"> 
     alert('Hello'); 
    </script> 

     {{>main}} 

</body> 

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

Edit: Chỉ cần thử nó với một ứng dụng sao băng tươi, không có thẻ cảnh báo vẫn còn:

<head> 
    <title>test</title> 
</head> 

<body> 

    <script type="text/javascript"> 
    alert('Hello'); 
    </script> 

    {{> hello}} 
</body> 

<template name="hello"> 
    <h1>Hello World!</h1> 
    {{greeting}} 
    <input type="button" value="Click" /> 
</template> 

điều Weird là khi tôi copy dán nguồn html, thực hiện một trang html mới, và các cảnh báo sẽ làm việc.

Chỉnh sửa3: Tôi đã triển khai ứng dụng này tại đây: http://alert-in-body-test.meteor.com/ Bạn có nhận được hộp cảnh báo không?

Trả lời

0

Nó sẽ hoạt động.

Tôi vừa dán vào bên trong một trong các dự án của mình và nó đã hoạt động.

{{>}}} của bạn là điều kỳ lạ đối với tôi khó khăn. Ngoài ra, hãy đảm bảo rằng <body> nằm trong thẻ <html>.

+0

"Cũng đảm bảo rằng là bên trong tag". Đó không phải là cách các mẫu sao băng hoạt động và trên thực tế là tùy chọn trong html thông thường. – Noishe

0

Meteor được xây dựng toàn bộ DOM từ Javascript bằng cách làm cho trang web của bạn như là một mẫu - những 'nguồn' cho trang của bạn như đã thấy từ trình duyệt sẽ cơ bản:

<script type="text/javascript" src="/5a8a37bef5095c69bcd3844caf3532e1ba6d49bf.js"></script> 

tôi không thể tìm thấy một dứt khoát trang tuyên bố rằng việc nhúng một thẻ script vào một mẫu như thế này sẽ không làm cho nó được thực hiện, nhưng nó chắc chắn cảm thấy chống lại tinh thần của những gì khuôn khổ đang cố gắng đạt được.

Nếu điểm là đạt được sự tách biệt rõ ràng về đánh dấu và logic của bạn thì tại sao phải đặt nó trong mẫu. Một giải pháp tốt hơn là sử dụng số meteor.startup gọi

3

Câu hỏi này vẫn có liên quan trong phiên bản hiện tại của Meteor (phiên bản 0.5.4) vì vậy tôi muốn mô tả cách bao gồm tập lệnh ở cuối phần thân.

Để thực hiện javascript ở phần cuối của cơ thể, đăng ký một helper tay lái và đặt mã có liên quan ở đó, như thế này:

Trong client.html:

<body> 
    {{renderPage}} 

    {{afterBody}} 
</body> 

...

Trong client.js:

if (typeof Handlebars !== 'undefined') { 
    Handlebars.registerHelper('afterBody', function(name, options) { 
    $('body').append('AFTER BODY'); 
    }); 
} 

(Để có mô tả tuyệt vời về lý do tại sao điều này là bắt buộc, hãy Câu trả lời của e Rahul cho một câu hỏi tương tự ở đây: https://stackoverflow.com/a/14002991/219238)

+0

đây là một giải pháp khá thiên tài. +1 – KJW

+1

bạn có đặt javascript trong 'SAU CƠ THỂ' – KJW

+0

Cảm ơn Jong Woo! Javascript của bạn sẽ đi vào bên trong hàm ẩn danh, thay thế mã $ ('body'). Append(). – alanning

0

Thay vì tìm kiếm html được hiển thị ở công cụ nhà phát triển, hãy thử tìm kiếm html tải xuống thực. Bạn sẽ tìm thấy một thẻ (có thể) trống, với hàng tấn thẻ script bên trong.

Nói cách khác, phần thân của ứng dụng sao băng không phải là phần nội dung của html cuối cùng, nó chỉ là mẫu chính của bạn.

Thay vào đó, tấn này trên các tập lệnh do Meteor vận chuyển, sẽ tải mẫu của bạn. Vì vậy, mã của bạn sẽ không chạy, vì nó được đặt ở đó. Nó giống như khi bạn thao tác DOM (với jQuery, ví dụ), đặt một thẻ script trong DOM, sau khi nó được nạp. Thẻ tập lệnh này sẽ không chạy.

1

của nó làm việc cho tôi

trong OnRender gọi jquery này

$ .getScript ('bạn url')

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