1

FireFox 说我的方法 doSend 没有定义,但它是。
Chrome 对 websocket 只字未提……

这是我的代码:

<html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:ui="http://java.sun.com/jsf/facelets"
  xmlns:h="http://java.sun.com/jsf/html"
  xmlns:p="http://primefaces.org/ui"
  xmlns:c="http://java.sun.com/jsp/jstl/core"
  xmlns:f="http://java.sun.com/jsf/core">
<h:head>
<script type="text/javascript">

    var image;
    var output;
    function init() {
        console.log('CONNECTED to websockets!');
        output = document.getElementById('output');
        testWebSocket();
    }

    //connects websocket to KwetterWebsocketBean
    function testWebSocket() {
        websocket = new WebSocket(wsUri);
        websocket.onopen = function(evt) {
            onOpen(evt);
        };
        websocket.onclose = function(evt) {
            onClose(evt);
        };
        websocket.onmessage = function(evt) {
            onMessage(evt);
        };
        websocket.onerror = function(evt) {
            onError(evt);
        };
    }

    //define event handlers
    function onOpen(evt) {
    }            
    function onWindowClose(evt){
        websocket.close();
    }
    function onClose(evt) {
    }
    function onMessage(evt) {
        //convert json to javascript object
        var message = JSON.parse(evt.data);
        writeToScreen('<span style="color: green;">New tweet by ' + message.username + ': ' + message.text + '</span>');
        console.log(message.text + ' : ' + message.username);
        //write message.text to screen
    }

    function onError(event) {
    }

    function doSend(message) {
        console.log(message);
        websocket.send(message);
    }

    //appends text to #output
    function writeToScreen(text) {
        var pre = document.createElement('p');
        pre.style.wordWrap = 'break-word';
        pre.innerHTML = text;
        output.appendChild(pre);
    }

    //invoke init() on load
    window.addEventListener('load', init, false);

    //enter key clicks #sendButton
    function keyPressed(event){
        if(event.keyCode == 13){
            document.getElementById('sendButton').click();
            document.getElementById('textforws').value='';
        }
    }
</script>
</h:head>
<h:body>
    <ui:composition template="./aTemplate.xhtml">
        <ui:define name="S1">
            <h1>What's happening?</h1>
            <h:form id="formNewestTweet">
                <p:inputText maxlength="140" value="aMessage"/>
                <p:commandButton value="Post Tweet" id="sendButton"                                     
                                 onclick='doSend("aMessage");'/>
            </h:form>
            <div id="output"/>
        </ui:define>
    </ui:composition>
</h:body>
</html>

我应该如何解决这个问题?

4

2 回答 2

3

<ui:composition>在 Facelets 中,模板客户端之外的任何内容都会被忽略。基本上,您需要将内容放在<ui:define>.<ui:composition>

在您的特定情况下,有几种方法可以修复此错误代码:

  1. 直接放进去<ui:define>

    <ui:composition template="./aTemplate.xhtml">
        <ui:define name="S1">
            <script type="text/javascript">
                ...
            </script>
            ...
        </ui:define>
    </ui:composition>
    
  2. 同样的方式,但随后使用<h:outputScript target="head">代替<script>. 它会自动出现在 HTML 头中(前提是你有 a<h:head>而不是<head>在你的主模板中aTemplate.xhtml):

    <ui:composition template="./aTemplate.xhtml">
        <ui:define name="S1">
            <h:outputScript target="head">
                ...
            </h:outputScript>
            ...
        </ui:define>
    </ui:composition>
    
  3. 在主模板<ui:insert name="head">的底部添加一个新的并在其中声明:<h:head>aTemplate.xhtml

    <ui:composition template="./aTemplate.xhtml">
        <ui:define name="head">
            <script type="text/javascript">
                ...
            </script>
        </ui:define>
    
        <ui:define name="S1">
            ...
        </ui:define>
    </ui:composition>
    

也可以看看:


与具体问题无关,我建议将主模板文件放在/WEB-INF文件夹中并像这样使用它

<ui:composition template="/WEB-INF/aTemplate.xhtml">

否则最终用户可以单独打开它并查看原始(未解析)源代码。

也可以看看:

于 2013-07-02T12:46:41.970 回答
0

尝试在之间声明方法

  <head></head>

标签

因为head标签中包含的所有脚本都是在body标签之前渲染的

以及体内的事件。

于 2013-07-02T12:13:11.470 回答