JavaScript eval() fails with window.external.notify(), works with window.alert()
Asked Answered
R

2

23

On WP8, if I execute (1):

Microsoft.Phone.WebBrowser wb;
wb.InvokeScript("eval", "window.external.notify('abc');");

It throws a 'target of invocation returned an error', unknown error, hresult 80020101. But (2)

wb.InvokeScript("eval", "window.alert('abc');");

works fine, and displays the message box.

And (3)

wb.InvokeScript("eval", "( function (){window.external.notify('abc');})();");

Also works fine.

My question is, what is it about window.external.notify() that prevents eval from invoking it directly? It is a function call, like window.alert(), so it should be a valid script. But if there is something special about the unadorned call in 1), then why does the wrapped call in 3) work?

I understand that eval() is the root of all evil, and I have read other SO posts relating to eval() problems with a function definition. (Where would we all be without SO?) But this is clearly a different problem.

Rahr answered 17/9, 2013 at 22:56 Comment(2)
This may be related to whatever is in your HTML. It might be trigger quirks mode or similar. Can you show a full repro of the issue?Unpracticed
Thank you for providing the wokraround in (3). God bless you.Laith
E
1

I think it is related with context of calling that eval(...).

If you call eval("window.external.notify('abc');"), the script should be called on the global window context.

You can check the context as below to pring the current context:
eval("console.log(this); window.external.notify('abc');")

Then try to test in those 3 ways to check is there any difference about the context.

To specify one context to run, you can use call or apply to set context with first param.

Emerick answered 13/11, 2014 at 9:38 Comment(0)
L
0

For executing JavaScript code in WebView from C# use InvokeScript and getting values from java script functions in C# use window.external.notify in java script function. to catch value in C# from java script functions use following code.

private void Web_OnScriptNotify(object sender, NotifyEventArgs e)
{
    Debug.WriteLine("Called from ScriptNotify! {0}", new[] { e.Value });
}
Londoner answered 25/4, 2016 at 12:50 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.