2010-04-21 2 views
3

티타늄의 webview 내부에서 열린 외부 HTML 페이지에서 이벤트를 실행하려고합니다.티타늄의 webview를 사용하여 API 이벤트 발생 문제가 발생했습니다.

app.js 파일은 ...

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 발췌 ...


$("#testButton").mousedown(function() { 
    alert ("I got clicked."); 
    Ti.App.fireEvent('browse', {something:'stuff'}); 
}); 
은 (내가 보장하기 위해 URL에있는 시간을 포함 항상 신선한 페이지입니다.)

위와 같이 이벤트 리스너를 사용하거나 view.addEventListener를 사용하여 컴파일하지만 궁극적으로는 작동하지 않습니다.

Titanium.UI.WebView.addEventListener를 사용하면 개체가 존재하지 않는다는 오류 메시지가 나타납니다.

URL/webview를 다른 방식으로 열어야합니까?

또한 Titanium.App.fireEvent는 Titanium을 제외한 인식 된 함수가 아니기 때문에 JavaScript 오류를 어떻게 방지 할 수 있습니까?

감사합니다. 나는이 보안상의 이유로 더 이상 원격 페이지와 함께 작동합니다 생각하지 않습니다 - 단지 당신이 모든 경고하는 apps.js

Ti.App.addEventListener('fromwebview', function(data) 
{ 
    Titanium.API.info("--> " + data.name); 
}); 

답변

7
// 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> 

. 결실을 보면서 노년을 보냈습니다!

+0

내가 어떤 버전을 사용하고 있는지 알 수 있습니까? 현재 티타늄 버전 1.5에서도 가능합니까? – davidlee

+1

은 1.5 이상에서 작동해야합니다. 추가 정보 [1]을 참조하십시오. http : //blog.clearlyinnovative.com/post/1468367224/titanium-appcelerator-quickie-fire-events-from-webview –

1

티타늄 주입 코드를 포함하여 원격 HTML 페이지에서이 작업을 할 수 있습니다. SDK 1.8.3의 경우 다음과 같습니다. 이제 원격 html 페이지에서 장치와 통신 할 수 있습니다.

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; 
+0

코드가 잘리는 것처럼 보입니다. .bin은 pastebin에 관한 링크입니다 : http://pastebin.com/5m3EXc43 – Brian