Tôi muốn buộc một chương trình JavaScript phải đợi trong một số điểm cụ thể của việc thực hiện nó cho đến khi biến đã thay đổi. Có cách nào để làm điều đó? Tôi đã tìm thấy một phần mở rộng được gọi là "JavaScript tường thuật" để buộc chương trình phải đợi cho đến khi một sự kiện xảy ra. Có cách nào để tạo sự kiện mới, "sự kiện thay đổi biến" chẳng hạn như hoạt động như sự kiện onclick không.Làm cách nào để tôi có thể thực hiện một chương trình chờ thay đổi trong javascript?
Trả lời
Không, bạn sẽ phải tạo giải pháp của riêng mình. Giống như sử dụng mẫu thiết kế Observer hoặc một cái gì đó.
Nếu bạn không có quyền kiểm soát biến hoặc người đang sử dụng nó, tôi e rằng bạn đang phải chịu số phận. EDIT: Hoặc sử dụng giải pháp của Skilldrick!
Mike
một giải pháp nhanh chóng và dễ dàng đi như thế này:
var something=999;
var something_cachedValue=something;
function doStuff() {
if(something===something_cachedValue) {//we want it to match
setTimeout(doStuff, 50);//wait 50 millisecnds then recheck
return;
}
something_cachedValue=something;
//real action
}
doStuff();
Tôi muốn giới thiệu một wrapper mà sẽ xử lý giá trị được thay đổi. Ví dụ: bạn có thể có chức năng JavaScript, như sau:
function Variable(initVal, onChange)
{
this.val = initVal; //Value to be stored in this object
this.onChange = onChange; //OnChange handler
//This method returns stored value
this.GetValue = function()
{
return this.val;
}
//This method changes the value and calls the given handler
this.SetValue = function(value)
{
this.val = value;
this.onChange();
}
}
Và sau đó bạn có thể tạo một đối tượng để giữ giá trị bạn muốn theo dõi và cũng có chức năng sẽ được gọi khi giá trị nhận được đã thay đổi. Ví dụ, nếu bạn muốn được thông báo khi có những thay đổi giá trị, và giá trị ban đầu là 10, bạn sẽ viết mã như thế này:
var myVar = new Variable(10, function(){alert("Value changed!");});
Handler function(){alert("Value changed!");}
sẽ được gọi (nếu bạn nhìn vào code) khi SetValue()
là gọi là.
Bạn có thể nhận được giá trị như sau:
alert(myVar.GetValue());
Bạn có thể thiết lập giá trị như sau:
myVar.SetValue(12);
Và ngay sau đó, một cảnh báo sẽ được hiển thị trên màn hình. Xem cách hoạt động: http://jsfiddle.net/cDJsB/
Cảm ơn bạn đã trả lời, nhưng nó không phải là chính xác những gì tôi muốn. Nhìn nhận xét của tôi để aularon xin vui lòng! –
Trình thông dịch JavaScript là một chuỗi duy nhất, do đó biến không bao giờ thay đổi, khi mã đang chờ ở một số mã khác không thay đổi biến.
Theo tôi, đó sẽ là giải pháp tốt nhất để bọc biến trong một số loại đối tượng có chức năng getter và setter. Sau đó bạn có thể đăng ký một hàm gọi lại trong đối tượng được gọi khi hàm setter của đối tượng được gọi. Sau đó bạn có thể sử dụng hàm getter trong callback để lấy giá trị hiện tại:
function Wrapper(callback) {
var value;
this.set = function(v) {
value = v;
callback(this);
}
this.get = function() {
return value;
}
}
này có thể dễ dàng sử dụng như thế này:
<html>
<head>
<script type="text/javascript" src="wrapper.js"></script>
<script type="text/javascript">
function callback(wrapper) {
alert("Value is now: " + wrapper.get());
}
wrapper = new Wrapper(callback);
</script>
</head>
<body>
<input type="text" onchange="wrapper.set(this.value)"/>
</body>
</html>
Có lẽ giải pháp tốt nhất nếu bạn có quyền kiểm soát biến ban đầu. – Skilldrick
Cảm ơn bạn đã trả lời, nhưng nó không phải là chính xác những gì tôi muốn. Nhìn nhận xét của tôi để aularon xin vui lòng! –
Như tôi đã giải thích các thông dịch viên JavaScript đơn luồng. Bạn không thể chặn các chủ đề và làm cho nó chờ đợi cho một số chủ đề khác để thay đổi một biến, bởi vì không có chủ đề khác có thể thay đổi một biến. Không có trình xử lý sự kiện JavaScript nào có thể được thực thi trong khi một trình xử lý sự kiện khác đã thực thi. – Reboot
Bạn có thể sử dụng tính:
Object.defineProperty MDN documentation
Ví dụ:
function def(varName, onChange) {
var _value;
Object.defineProperty(this, varName, {
get: function() {
return _value;
},
set: function(value) {
if (onChange)
onChange(_value, value);
_value = value;
}
});
return this[varName];
}
def('myVar', function (oldValue, newValue) {
alert('Old value: ' + oldValue + '\nNew value: ' + newValue);
});
myVar = 1; // alert: Old value: undefined | New value: 1
myVar = 2; // alert: Old value: 1 | New value: 2
- 1. Tôi làm cách nào để trình duyệt có thể xem các thay đổi CSS và Javascript?
- 2. Làm cách nào tôi có thể thấy các thay đổi đang chờ xử lý của Khung thực thể?
- 3. làm cách nào để tôi có thể thay đổi DOCTYPE
- 4. Làm cách nào để chương trình của tôi có thể phát hiện xem chương trình có đang chạy trên một miền cụ thể không?
- 5. Làm cách nào tôi có thể thực hiện tìm kiếm mờ bằng django-haystack và chương trình phụ trợ elasticsearch?
- 6. Có thể thay đổi chương trình CSS Validation trong VS2010
- 7. Tôi có thể thay đổi config.cache_classes theo chương trình trong Rails 3 không?
- 8. Tôi làm cách nào để thực hiện thử nghiệm đột biến của chương trình Java?
- 9. Trong trình xử lý onclick, làm cách nào tôi có thể phát hiện xem có thay đổi được nhấn không?
- 10. Làm cách nào để thực thi Javascript trong chương trình Delphi của tôi mà không có TWebBrowser?
- 11. Làm cách nào tôi có thể thực hiện nhiều thay thế trong python?
- 12. Làm cách nào tôi có thể xem/thay đổi cài đặt thời gian chờ kết nối MySQL?
- 13. Làm cách nào để thay đổi trình bảo vệ màn hình theo chương trình?
- 14. Làm thế nào để thực hiện chương trình một bộ thử nghiệm bằng cách sử dụng JUnit4 theo chương trình?
- 15. Làm cách nào để thay đổi thời gian chờ cho truy vấn được thực hiện thủ công trong SQL Server?
- 16. Làm cách nào tôi có thể thực hiện tìm kiếm theo chương trình mà không cần sử dụng API?
- 17. Thực hiện chương trình từ bên trong chương trình C
- 18. Chương trình của tôi đã được "xuất bản", làm thế nào tôi có thể thay đổi đường dẫn cài đặt?
- 19. Làm cách nào để tôi có thể kéo --rebase nhưng thực hiện tất cả các thay đổi từ xa?
- 20. JQuery Datatables. Làm thế nào tôi có thể thay đổi trang hiện tại theo lập trình?
- 21. Làm thế nào tôi có thể lấy tên của chương trình con hiện tại trong Perl?
- 22. Làm cách nào để gỡ lỗi chương trình do một người dùng khác thực hiện?
- 23. Tôi làm cách nào để ngăn chặn trình bảo vệ màn hình và ngủ trong khi thực hiện chương trình?
- 24. Làm cách nào để tôi có thể tạo Visual Studio ngay trước khi chương trình dừng?
- 25. Làm thế nào tôi có thể thay đổi địa chỉ điểm cuối chương trình trong trang web của khách hàng?
- 26. Làm thế nào tôi có thể nhận được jQuery hoặc Javascript để thay đổi css dựa trên url hiện tại?
- 27. Làm thế nào để chờ quá trình chấm dứt thực hiện một quy trình khác trong tập tin thực thi
- 28. Làm thế nào tôi có thể thay đổi lập trình argspec của một hàm trong một trình trang trí python?
- 29. Làm cách nào để tôi có thể thêm một tệp mà không thay đổi thư mục làm việc hiện tại?
- 30. Làm thế nào để bạn thực hiện một chương trình ngủ trong C + + trên Win 32?
chỉnh sửa ngay bây giờ, nó sẽ kiểm tra mọi 50ms và hoạt động đối với những người không phải là kẻ ngu.nó như tôi đã nói cách nhanh chóng và dễ dàng để làm điều đó, hãy làm theo liên kết này: http://stackoverflow.com/questions/1029241/javascript-object-watch-for-all-browsers (được đăng bởi @mplungjan) để biết thêm giải pháp chống vấn đề chuyên sâu. – aularon
Tôi nghĩ bạn có nghĩa là 'cái gì đó === something_cachedValue'. Sau đó, nó hoạt động: http://jsfiddle.net/pEnYC/ – Skilldrick
@ Skilldrick, vâng tôi có nghĩa là, tôi đã sửa nó. Cảm ơn sự điều chỉnh:) – aularon