积极答复者
webview事件响应问题

问题
-
很疑问的一个问题:将一个webview放置在我的应用里面,点击webview任何位置,所有事件都会被webview的网页接收。可是如果安装一个软件,比如手势软件,你在网页上面点击滑动,却可以响应,不被网页接收。这是为什么??
如何我想让webview响应我的鼠标事件,而不被网页接收,该如何做呢??
我查过一些资料,用ScriptNotify可以让网页回调事件,可以做到我想要的效果,可是我的网页存储在appdata下面,位于:Windows.Storage.ApplicationData.Current.LocalFolder,如果想让放于这里的网页正常显示的话,必须使用Navigate,Uri前面需要加上"ms-appdata:///local/"才能够正常显示,可是这种方式却不支持ScriptNotfiy。然后我改为NavigateToLocalStreamUri这种方式去显示,能够响应ScriptNotify,可是网页却不能够正常显示,尤其是图片。。急求解决方案。
答案
-
你好,因为win8.1未对外正式公布,所以目前中文论坛暂时不支持对win8.1新功能的支持,支持将从10月中旬开始。
不过你可以就这个问题到http://social.msdn.microsoft.com/Forums/en-US/home?forum=w81prevwCsharp 论坛去提问,会有专门负责win8.1的人员来帮助你解决问题。
--James
<THE CONTENT IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED>
Thanks
MSDN Community Support
Please remember to "Mark as Answer" the responses that resolved your issue. It is a common way to recognize those who have helped you, and makes it easier for other visitors to find the resolution later.- 已标记为答案 柳天赐 2013年9月23日 8:54
全部回复
-
Hi,
安装一个软件是什么意思,你是指在Windows store app里面装一个软件?
如果你想要webview响应鼠标事件而不被网页接受,以下有两种方案您可以考虑:
1. 可以直接使用WebViewBrush 加载网页内容。
2. 可以对WebView做Javascript Inject的操作,把下面这段代码注入到Javascript中
string InsertionScriptString = "function disableLink() { "; InsertionScriptString += "var links = document.links, i, length;"; InsertionScriptString += "for (i = 0, length = links.length; i < length; i++) {"; InsertionScriptString += "links[i].disabled ='true';}}";
同时,通过下面的代码把功能注入进去:
webview.InvokeScript("disableLink", null);
祝您好运!
<THE CONTENT IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED>
Thanks
MSDN Community Support
Please remember to "Mark as Answer" the responses that resolved your issue. It is a common way to recognize those who have helped you, and makes it easier for other visitors to find the resolution later.
- 已编辑 Anne JingModerator 2013年9月18日 7:51 from
-
Hi,
您第一个帖子说网页不响应鼠标事件,第二个帖子却说网页是互交的,那么不响应事件如何做到互交,所以我对本帖的理解是:你的页面仅仅用来展示,而通过ScripyNotify获取页面的信息。
所以基于这个理解,我的想法是你可以建立一个WebViewBrush用来展示,一个隐藏的WebView作为互交,你觉得这个能满足你的要求么?
另外我想知道的是你从哪里的MSDN文档上看到ScripyNotify不支持ms-appdata///local/的,我查看了下文档ScriptNotify event 我查看了下文档并没有看到有关于不支持的说法,仅仅只有在WebView的页面上说:WebView does not support the ms-appdata scheme, although it does support the ms-appx-web scheme, which you can use to load content files from your app package。
我们的MSDN blog上有一篇文档:http://blogs.msdn.com/b/wsdevsol/archive/2012/10/18/nine-things-you-need-to-know-about-webview.aspx 你可以参看下第五条,里面的例子用的就是存放在本地的HTML文档,图片的话我试过,是可以显示的,另外ScripyNotify的功能也是可以实现的。
我这里上传一个例子到Skydrive希望你可以参考:http://sdrv.ms/16kEBC9
Best Regards,
<THE CONTENT IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED>
Thanks
MSDN Community Support
Please remember to "Mark as Answer" the responses that resolved your issue. It is a common way to recognize those who have helped you, and makes it easier for other visitors to find the resolution later. -
网页必须是存储在application data下面,不是appx下面。就是这个位置:Windows.Storage.ApplicationData.Current.LocalFolder。。。存放在你那个位置确实是可行的。
你可以尝试将网页放到C:\Users\你的用户\AppData\Local\Packages\你项目的package name\LocalState
这是应用程序的私有空间。只用通过Navigate("ms-appdata///local/xxxx/xxx.html")才能够正常显示,你可以试试。
而用了ms-appdata这种方式的话,ScriptNotify没有任何响应。你也可以尝试下。如果你有QQ的话,加我QQ交流下:2519576065,谢谢啦!!!
-
Hi 柳天赐,
在代码里面有这么一段话,不知道您注意到没有,你可以尝试把HTMLPage1.html放在C:\Users\你的用户\AppData\Local\Packages\你项目的package name\LocalState下面,然后comment掉read from project这段话,运行read from local folder,再试一下代码。代码运行时,点击WebView中的UpdateTime按钮可以看到下面的TextBox内容跟着变化了,也就是说ScriptNotify事件被激活了。
//read from local folder //Windows.Storage.StorageFile MyWebPageFile = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appdata:///local/HTMLPage1.html")); //read from project Windows.Storage.StorageFile MyWebPageFile = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///HTMLPage1.html"));
Best Regards,
--James
<THE CONTENT IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED>
Thanks
MSDN Community Support
Please remember to "Mark as Answer" the responses that resolved your issue. It is a common way to recognize those who have helped you, and makes it easier for other visitors to find the resolution later. -
Hi 这位同学,你应该运行这段话:Windows.Storage.StorageFile MyWebPageFile = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appdata:///local/HTMLPage1.html"));
这段话才是从C:\Users\你的用户\AppData\Local\Packages\你项目的package name\LocalState这个地址读取HTML文件。如果你把HTML文件从工程中移除,new Uri("ms-appx:///HTMLPage1.html")是肯定找不到目标文件的。
<THE CONTENT IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED>
Thanks
MSDN Community Support
Please remember to "Mark as Answer" the responses that resolved your issue. It is a common way to recognize those who have helped you, and makes it easier for other visitors to find the resolution later. -
OK,我又仔细看了下我们的回复,我知道我们的误会在哪里,可能是我没有讲清楚,抱歉。
你的意思是直接通过webview.Navigate(new Uri("ms-appdata:///local/HTMLPage1.html"))的方式来加载页面,如果是直接Navigate的确是不可行。我说的方式是先通过GetFileFromApplicationUriAsync方式获取文件,然后用webview.NavigateToString(MyWebPageString)的方式来显示页面,这种方式类似于把HTML代码读出来然后在WebView中展示,是可以ScripyNotify的。
不过我还是没能明白你想要做的,一方面不想让鼠标与网页互交,一方面又想使用ScripyNotify,你的意思是通过键盘方式来触发?还是说通过InvokeScript的方式来触发某些事件然后ScripyNotify获取返回值?如果是这样的话你可以前台做个WebViewBrush用来展示,外加一个隐藏的webView来响应你的事件。
<THE CONTENT IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED>
Thanks
MSDN Community Support
Please remember to "Mark as Answer" the responses that resolved your issue. It is a common way to recognize those who have helped you, and makes it easier for other visitors to find the resolution later. -
我重新讲下我的需求:我的程序通过网络将一些交互式的网页下载到application data下面。然后我想用全屏的webview将网页显示出来,正常显示。。。。然后我想获取一些事件,比如鼠标拖动事件。不想被网页给接收。类似遨游浏览器的手势并不会被网页接收似的。
目前用webview.Navigate(new Uri("ms-appdata///local/HTMLPage1.hmtl"))是可以正常将网页显示的,但是却不可以使用ScripyNotfiy这个网页回调功能。如果使用你说的NavigateToString函数的话,不太可行,因为我的网页包含了很多其他js,css和其他网页网页等。。。也不想用WebViewBrush来显示,因为这样的话,我的网页里面的输入框就不可输入了。。
明白吗??有解决方案吗?
-
Hi 柳天赐
在WinRT中webview功能没有那么强大,所以我觉得你的想法不太可行。 不过我觉得如果你用WinJS来做项目的话倒是有可行度。
--James
<THE CONTENT IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED>
Thanks
MSDN Community Support
Please remember to "Mark as Answer" the responses that resolved your issue. It is a common way to recognize those who have helped you, and makes it easier for other visitors to find the resolution later. -
你好,因为win8.1未对外正式公布,所以目前中文论坛暂时不支持对win8.1新功能的支持,支持将从10月中旬开始。
不过你可以就这个问题到http://social.msdn.microsoft.com/Forums/en-US/home?forum=w81prevwCsharp 论坛去提问,会有专门负责win8.1的人员来帮助你解决问题。
--James
<THE CONTENT IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED>
Thanks
MSDN Community Support
Please remember to "Mark as Answer" the responses that resolved your issue. It is a common way to recognize those who have helped you, and makes it easier for other visitors to find the resolution later.- 已标记为答案 柳天赐 2013年9月23日 8:54