2016-04-23 14 views
12

Khi thực hiện trong bối cảnh Node (node-main),Kiểm tra khi bối cảnh WebKit có sẵn trong NW.js

setTimeout(function() { 
    console.log(nw); 
}, 20); 

ném

nw không được định nghĩa

vì bối cảnh WebKit là chưa sẵn sàng (ngay từ đầu window không khả dụng ở NW.js < = 0.12, window.nw trong NW.js> = 0.13). Và

setTimeout(function() { 
    console.log(nw); 
}, 200); 

hoạt động tốt nhưng setTimeout trông giống như hack, đặt giá trị này thành giá trị trì hoãn an toàn có thể gây ra độ trễ không mong muốn.

Làm cách nào để tính khả dụng của ngữ cảnh WebKit và nw được kiểm tra từ ngữ cảnh Node? Có cách nào hợp lý, giống như một sự kiện có thể được xử lý?

+0

Đang chạy chức năng chính của nút khi WebKit tải một tùy chọn? –

+0

@RahatMahbub Tôi đã hy vọng có một cách chính thức (có thể không có giấy tờ) để thực hiện điều này chỉ qua Node, như sự kiện toàn cầu.Điều này sẽ có ý nghĩa, nhưng nếu không có thì sau đó gọi lại từ trang html là lựa chọn duy nhất, tôi đoán. – estus

+0

@estus Có một cách để làm điều đó nhưng tôi không nghĩ rằng đó là một cách đặc biệt gọn gàng. Tôi có thể thêm nó vào câu trả lời của tôi nếu bạn muốn. – Harry

Trả lời

1

Các giải pháp tôi đã bước đầu đưa ra trông giống như

app-Node.js

process.once('webkit',() => { 
    console.log(nw); 
}); 

app.html

<html> 
<head> 
    <script> 
     global.process.emit('webkit'); 
    </script> 
    ... 

Tôi rất vui khi biết rằng đã có một sự kiện để nghe, vì vậy các tập lệnh khách hàng đa nền tảng có thể bỏ qua mã liên quan đến NW.

2

Sau đây cũng đạt được điều tương tự nhưng thực hiện theo cách khác.

Trong file html của bạn:

<body onload="process.mainModule.exports.init()">

Trong file JS nút-chính của bạn:

exports.init = function() { console.log(nw); }

Ở đây, hàm init chỉ gọi khi bối cảnh Webkit/DOM có sẵn.

2

Bạn có thể sử dụng pollit :) ...

var pit = require("pollit"); 
foo = function(data) { 
    console.log(nw); 
}; 
pit.nw('nw', foo);  

Tôi đã thử nghiệm nó và nó làm việc cho tôi :). Điều này mô đun hóa các giải pháp mà tôi đưa ra gần cuối này.

Đối tượng nw không tồn tại cho đến khi webkit được bật và chạy tức là cửa sổ trình duyệt đã được tạo. Điều này xảy ra sau khi Node khởi động, đó là lý do tại sao bạn bị lỗi . Để sử dụng số điện thoại nw api, bạn có thể tạo các sự kiện có thể là nghe hoặc gọi các chức năng toàn cầu trước đây là thích hợp hơn. Các mã sau đây sẽ chứng minh cả hai và nên cung cấp cho bạn một ý tưởng tốt về cách NodeWebKit đang giao tiếp với nhau.

Ví dụ này tạo Cửa sổ, mở trình khám phá và cho phép bạn chuyển đổi màn hình . Nó cũng hiển thị vị trí chuột trong bảng điều khiển. Nó cũng chứng tỏ làm thế nào để gửi các sự kiện bằng cách sử dụng DOM tức là body.onclick() và gắn các sự kiện từ bên trong Node tức là chúng ta sẽ bắt các sự kiện minimize và ghi chúng vào bàn điều khiển.

Để làm việc này, bạn cần sử dụng phiên bản SDK NW. Đây là gói của tôi.json

{ 
    "name": "hello", 
    "node-main": "index.js", 
    "main": "index.html", 
    "window": { 
    "toolbar": true, 
    "width": 800, 
    "height": 600 
    }, 
    "dependencies" : { 
    "robotjs" : "*", 
    "markdown" : "*" 
    } 
} 

Hai tập tin bạn cần là index.html

<!DOCTYPE html> 
<html> 
    <head> 
    <script> 
     var win = nw.Window.get(); 
     global.win = win; 
     global.console = console; 
     global.main(nw); 
     global.mouse(); 
     var markdown = require('markdown').markdown; 
     document.write(markdown.toHTML("-->Click between the arrows to toggle full screen<---")); 
    </script> 
    </head> 
    <body onclick="global.mouse();"> 
    </body> 
</html> 

index.js.

var robot = require("robotjs"); 

global.mouse = function() { 
    var mouse = robot.getMousePos(); 
    console.log("Mouse is at x:" + mouse.x + " y:" + mouse.y); 
    global.win.toggleFullscreen(); 
} 

global.main = function(nw_passed_in) { 
    global.win.showDevTools(); 
    console.log("Starting main"); 
    console.log(nw_passed_in); 
    console.log(nw); 
    global.win.on('minimize', function() { 
    console.log('n: Window is minimized from Node'); 
    }); 
} 

Khi chạy này tôi đã sử dụng

nwjs --enable-logging --remote-debugging-port=1729 ./ 

Sau đó bạn có thể mở trình duyệt sử dụng

http://localhost:1729/ 

để gỡ lỗi nếu cần thiết.

Nếu bạn muốn làm điều gì đó ngay khi đối tượng nw tồn tại, bạn có thể thăm dò ý kiến ​​đó. Tôi muốn sử dụng eventEmitter, nếu bạn không muốn sử dụng bộ phát sự kiện, bạn có thể dễ dàng bọc nó trong một hàm và gọi nó theo cách đệ quy. Sau đây sẽ hiển thị số lượng phần nghìn giây trước khi đối tượng nw được thiết lập. Trên hệ thống của tôi, nó dao động trong khoảng 43 - 48 mili giây. Sử dụng hàm đệ quy không khác nhau. Nếu bạn thêm mã này vào mã ở trên, bạn sẽ thấy mọi thứ được ghi vào bảng điều khiển.

var start = new Date().getTime(); 
var events = require('events'); 
var e = new events.EventEmitter(); 

var stop = 0; 
e.on('foo', function() { 
if(typeof nw === 'undefined') { 
    setTimeout(function() { 
    e.emit('is_nw_defined'); 
    }, 1); 
} 
else { 
    if(stop === 0) { 
    stop = new Date().getTime(); 
    } 
    setTimeout(function() { 
    console.log(stop - start); 
    console.log(nw); 
    e.emit('is_nw_defined'); 
    }, 2000); 
} 
}); 
e.emit('is_nw_defined'); 
+0

Cảm ơn gói 'pollit', trông giống như một hack nhưng một cái tốt, hiệu suất hit và độ trễ quá mức gần như bằng không. – estus

1

Giải pháp 1:

Bạn có thể sử dụng onload, see reference.

main.js:

var gui = require("nw.gui"), 
    win = gui.Window.get(); 

onload = function() { 
    console.log("loaded"); 
    console.log(win.nw); 
}; 

index.html:

<!DOCTYPE html> 
<html> 
    <head> 
     <script type="text/javascript" src="main.js"></script> 
    </head> 
    <body></body> 
</html> 

package.json:

{ 
    "name": "Freebox", 
    "main": "index.html" 
} 

Giải pháp 2:

(Để ngăn chặn sự cố, nhưng không cần thiết).

var gui = require("nw.gui"), 
    win = gui.Window.get(); 

onload = function() { 
    console.log("loaded"); 
    var a = function() { 
     if (!win.nw) return setTimeout(a, 10); 
     console.log(win.nw); 
    }; 
}; 
+0

Giải pháp này là sai. yêu cầu ('nw.gui') là cách di sản để lấy đối tượng nw. Bạn cũng thiếu điểm OP về ngữ cảnh, bạn không ở trong ngữ cảnh nút tại bất kỳ điểm nào trong câu trả lời này. – Harry

+0

@ Harry đó là một ví dụ. –

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