Probleme Titanium Webansicht mit einem API-Ereignis ausgelöst
-
30-09-2019 - |
Frage
Ich versuche, ein Ereignis von einer externen HTML-Seite zu feuern innerhalb von Titanium webview geöffnet.
app.js Datei ...
var group, now, tab, view, window;
now = new Date();
view = Titanium.UI.createWebView({url: 'http://MYWEBSITE.com/index.htm?time=' + now.getTime()});
window = Titanium.UI.createWindow({tabBarHidden: true, navBarHidden: true});
window.add(view);
Titanium.App.addEventListener('browse', function(e) {
Ti.API.info("I received " + e.something + " from the webview.");
});
group = Titanium.UI.createTabGroup();
tab = Titanium.UI.createTab({title: 'window', window: window});
group.addTab(tab);
group.open(tab);
js Auszug aus Web-Seite ...
$("#testButton").mousedown(function() {
alert ("I got clicked.");
Ti.App.fireEvent('browse', {something:'stuff'});
});
(I umfassen die Zeit in der URL der Seite, um sicherzustellen, ist immer frisch.)
Das Hinzufügen des Ereignis-Listener, wie oben gezeigt, oder mit view.addEventListener, compiliert, aber letztlich nicht funktioniert.
Titanium.UI.WebView.addEventListener Verwendung erzeugt eine Fehlermeldung, dass das Objekt nicht existiert.
Muss ich die URL / Webansicht auf eine andere Weise öffnen?
Auch da Titanium.App.fireEvent keine anerkannte Funktion, außer Titan, wie nicht verhindert man einen JavaScript-Fehler?
Danke.
Lösung
// from web page
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<div id='testButton'>TEST BUTTON</div>
</body>
<script>
var _button = document.getElementById ("testButton");
_button.onmousedown = function () {
alert (this.id);
Ti.App.fireEvent('fromwebview', {name:this.id});
return false;
};
</script>
</html>
von apps.js
Ti.App.addEventListener('fromwebview', function(data)
{
Titanium.API.info("--> " + data.name);
});
Andere Tipps
Nur Sie alle warnen - ich glaube nicht, das funktioniert mit Remote-Seiten mehr aus Sicherheitsgründen. Verbrauchte schon versucht fruchtlos!
Sie können diese Arbeit auf der Fernbedienung HTML-Seite durch den Titanium Injection-Code enthält. Für 1.8.3 sdk ist es die folgenden. Jetzt ist Ihre Remote-HTML-Seite an das Gerät sprechen.
var Ti = {_event_listeners:[],createEventListener:function(listener ){ var newListener={ listener:listener ,systemId:-1 ,index:this._event_listeners.length };this._event_listeners.push(newListener);return newListener;},getEventListenerByKey:function(key,arg){for(var i=0;i<this._event_listeners.length;i++){if(this._event_listeners[i][key]==arg){return this._event_listeners[i];}} return null;},API:TiAPI,App:{addEventListener:function(eventName,listener) {var newListener=Ti.createEventListener(listener);newListener.systemId=TiApp.addEventListener(eventName,newListener.index);return newListener.systemId;},removeEventListener:function(eventName,listener) {if(typeof listener=='number'){TiApp.removeEventListener(eventName,listener);var l=Ti.getEventListenerByKey('systemId',listener);if(l!==null){Ti._event_listeners.splice(l.index,1);}}else{l=Ti.getEventListenerByKey('listener',listener);if(l!==null){TiApp.removeEventListener(eventName,l.systemId);Ti._event_listeners.splice(l.index,1);}}},fireEvent:function(eventName,data) {TiApp.fireEvent(eventName,JSON.stringify(data));}},executeListener:function(id,data) {var listener=this.getEventListenerByKey('index',id);if(listener!==null){listener.listener.call(listener.listener,data);}}};var Titanium=Ti;