【问题标题】:UIWebView not evaluating java script using method stringByEvaluatingJavaScriptFromString:UIWebView 不使用方法 stringByEvaluatingJavaScriptFromString 评估 java 脚本:
【发布时间】:2014-01-13 19:20:49
【问题描述】:

我无法从 UIWebView 评估 youtube api javascript 命令

这些命令在 Safari 和 Firefox 中正确评估

webview 使用选项初始化

allowsInlineMediaPlayback = YES;
mediaPlaybackRequiresUserAction = NO;

我正在加载的 Html 是:

<div id="player"></div>

<script>
    var tag = document.createElement('script');
    //playerVars: { 'autoplay': 0, 'modestbranding': 1, 'rel': 0, 'showinfo': 0, 'iv_load_policy': 3, 'controls': 1, 'playsinline':1 },
    var configuration = {
        playerVars: {
            'playsinline':1,
            'showinfo': 0,
            'modestbranding': 1
        },
        events: {
            'onReady': onPlayerReady,
            'onStateChange': onPlayerStateChange
        }
    };

tag.src = "https://www.youtube.com/iframe_api";
var firstScriptTag = document.getElementsByTagName('script')[0];
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);

function setup(key, value) {
    configuration[key] = value;
}

function configurePlayer(key, value) {
    configuration.playerVars[key] = value;
}
// area for the code injection
setup('videoId', 'cDhlx60nTCU');
setup('startingTime', 10);
setup('autoPlay' , true);
setup('width', 400);
setup('height', 200);
configurePlayer('controls', true);


var player;
function onYouTubeIframeAPIReady() {
    player = new YT.Player('player', configuration);
}

function onPlayerReady(event) {
    if (configuration['autoPlay']) {
        if (configuration['startingTime']) {
            player.playVideoAt(configuration['startingTime']);
        } else {
            event.target.playVideo();
        }
    }
}

function onPlayerStateChange(event) {
    if (event.data == YT.PlayerState.PLAYING) {
        // Do something...
    }
}

function stopVideo() {
    player.stopVideo();
    return "OK";
}
</script>
Printing description of html:
<div id="player"></div>

<script>
    var tag = document.createElement('script');
    //playerVars: { 'autoplay': 0, 'modestbranding': 1, 'rel': 0, 'showinfo': 0, 'iv_load_policy': 3, 'controls': 1, 'playsinline':1 },
    var configuration = {
        playerVars: {
            'playsinline':1,
            'showinfo': 0,
            'modestbranding': 1
        },
        events: {
            'onReady': onPlayerReady,
            'onStateChange': onPlayerStateChange
        }
    };

tag.src = "https://www.youtube.com/iframe_api";
var firstScriptTag = document.getElementsByTagName('script')[0];
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);

function setup(key, value) {
    configuration[key] = value;
}

function configurePlayer(key, value) {
    configuration.playerVars[key] = value;
}
// area for the code injection
setup('videoId', 'cDhlx60nTCU');
setup('startingTime', 0);
setup('autoPlay' , true);
setup('width', 320);
setup('height', 288);
configurePlayer('controls', true);


var player;
function onYouTubeIframeAPIReady() {
    player = new YT.Player('player', configuration);
}

function onPlayerReady(event) {
    if (configuration['autoPlay']) {
        if (configuration['startingTime']) {
            player.playVideoAt(configuration['startingTime']);
        } else {
            event.target.playVideo();
        }
    }
}

function onPlayerStateChange(event) {
    if (event.data == YT.PlayerState.PLAYING) {
        // Do something...
    }
}

function stopVideo() {
    player.stopVideo();
    return "OK";
}
</script>

我正在用这个加载 webview 页面

-(void)viewDidAppear:(BOOL)animated
{
    [self.webview loadHTMLString:html baseURL:[NSURL URLWithString:@"html"]];
}

在 webview 委托调用webViewDidFinishLoad之后

我尝试使用这种语法在播放器上调用方法

-(void)pause
{
    [self.webview stringByEvaluatingJavaScriptFromString:@"player.pauseVideo();"];
}

是否有任何标志会干扰 java 脚本评估?

【问题讨论】:

  • 您是否尝试过使用 Safari 或 Chrome 中的网络调试器将相同的 javascript 发送到页面?
  • 是的。当我在模拟器中运行页面并使用 safari 进行调试时,'player' 对象没有用正确的方法定义——它只有内部属性,没有 api 方法。但是当我在 chrome/firefox/safari 中加载页面时,一切都已正确定义
  • 我在这里看不到有什么东西可以让你跳出来。在我发布我的示例代码之前,我希望您再尝试一件事:用有效的 HTML 包围
    。示例:
  • 刚刚在没有有效 HTML 的情况下测试了我的脚本。有些东西有效,有些东西无效,但我没有看到确切的问题。试一试并发布结果。
  • 我也试过了。我可能没有发布它,但它对我没有帮助

标签: javascript ios uiwebview youtube-api youtube-javascript-api


【解决方案1】:

改变这一行:

[webView loadHTMLString:embedHTML baseURL:[NSURL URLWithString:@"html"]];

到这里:

[webView loadHTMLString:embedHTML baseURL:[NSURL URLWithString:@"about:blank"]];

我注意到 stringByEvaluatingJavaScriptFromString 在您不使用有效 URL 时将不起作用(您会看到,当您使用 NULL 作为值时也会发生这种情况。我刚刚测试了您的代码版本,发现带有about:blank 的版本会正确评估JavaScript,而带有html 作为NSURL 值的版本则不会。

【讨论】:

  • 我想为您重新提出一个问题。我尝试了这种方法,一段时间内一切正常。现在,当自动播放设置为“真”时,它已停止内联播放。当设置为 true 时,youtube 视频不会播放 - 只有一个黑屏。当我将自动播放设置为“假”时,视频可以内联播放
  • 还有,只要我关闭自动播放 - 视频就不会内联播放,只能全屏播放
  • 您应该关闭这个问题并开始一个新问题。我们使用 StackOverflow 让其他有相同问题的人更容易找到答案,而以这种方式做事却很困难。
  • about:blank 对我不起作用,还有其他想法吗?
猜你喜欢
相关资源
最近更新 更多
热门标签