CFCLIENT:文档示例不起作用;什么都做不了?

CFCLIENT: Doc examples do not work; Can't get anything to work?

所以我意识到新的 CF11 移动功能已经收到了一些非常复杂的评论,但我想尝试一下,看看我是否可以将它们用于一些非常简单的设备检测,但是我无法得到任何东西实际工作。

例如,我正在查看 cfclientsettings 的文档,特别是页面上 "Device detection" 标题下的第一个示例。这是供参考的代码(我对其进行了一些格式化以确保此处易于阅读):

<cfClientSettings detectDevice=true /> 
<cfclient>
    <cffunction access="public" name="showCanvasSupport" returntype="void">
        <cfset evalStr = "document.getElementById('canvas').innerHTML='" & cfclient.canvas & "'">
    </cffunction>
</cfclient>

Canvas support -<b id="canvas"></b><br>
<button onclick="invokeCFClientFunction('showCanvasSupport',null)">Show canvas support</button>

创建一个新的 .cfm 页面并添加此代码会在页面上生成文本和按钮,但单击按钮会在 Chrome 中引发 JS 错误:"Uncaught The function signature is invokeCFClientFunction(functionName [, arg1, arg2, arg3, ...], successCallback, failureCallback). The functionName, successCallback and failureCallback are mandatory. If you don't have a successCallback or failureCallback, null can be passed as the value."

好吧,不太好。因此,我检查了更多文档并决定向 invokeCFClientFunction() 调用添加另一个空参数以修复缺少的回调。这至少纠正了 JS 错误,但现在单击按钮时什么也没有发生。

经过一番折腾,我得到了下面的代码,它仍然不起作用,但看起来更接近了:

<cfClientSettings detectDevice=true />
<cfclient>
    <cffunction access="public" name="showCanvasSupport" returntype="void">
        <cfscript>
            document.getElementById('canvas').innerHTML=cfclient.canvas;
        </cfscript>
    </cffunction>
</cfclient>

Canvas support -<b id="canvas"></b><br>
<button onclick="invokeCFClientFunction('showCanvasSupport',null,null)">Show canvas support</button>

因此,当您单击该按钮时,此代码会将 canvas 元素的 innerHTML 设置为 "undefined"。厉害了。

老实说,我一直在尝试我能找到的每个使用 cfclient 的示例,其中 NONE 个有效。我缺少什么秘密吗?我有一个潜在的怀疑,如果我不在 CFBuilder 中创建 'Mobile Project',那么这个东西就不起作用?如果是这样,那就太愚蠢了,他们并没有在文档中真正说明这一点。

最后,我想做的只是简单地使用 cfclient 进行一些基本的设备检测,并获取 browser/device 的宽度来进行一些基本的媒体查询样式检测,就像在cfclientsettings 文档的 "Using media queries" 部分。我只想抓取宽度,然后根据它设置一个 session 变量。

我 运行 在我的带有 IIS 的 Win7 机器上安装了完全修补的 CF11 开发人员版本。欢迎任何和所有支持。

在 Adob​​e 论坛上交叉 post:https://forums.adobe.com/thread/1929387

让我先声明一下我从未使用过 cfclient 并且我只是转发我在网上找到的文档以供使用。评论太长了。

您说:

I have a sneaking suspicion that if I'm not creating a 'Mobile Project' in CFBuilder that this stuff doesn't work? If so that's stupid and they don't state that in the docs really.

我认为他们确实在文档中说明了这一点。这是我发现的。在 Client-side CFML (for mobile development) 文档的开头,它指出:

Before you begin – To try out the examples provided in this document, you need to set up the ColdFusion mobile development environment. See Configuring the development environment.

我不打算在这里重复所有信息,因为它相当丰富,但是配置开发环境页面提到您必须安装 ColdFusion Server 11,安装 ColdFusion Builder然后在 Builder 中创建一个 'ColdFusion Mobile Project' 来帮助你。

但是该页面还指出,您可以按照 Migrating existing projects 下的步骤自动转换现有的 ColdFusion 项目,其中您 'Apply CF Mobile Nature' 从 ColdFusion Builder 到项目。 这可能是您遗漏的部分。

我认为,如果您通读了我引用的文档,可能会让您有所收获。这里还有一个 link 到他们的 Building Mobile Applications 文档,其中包含整个过程的概述。

在键盘上敲了一会儿之后,我的 cfclient 范围开始工作了。

我终于在文档中找到了这个页面:Device Detection

乍一看,此页面似乎与 cfclientsettings 文档页面几乎相同,甚至具有相同的代码示例。

但是,cfclientsettings 文档使用这样的范围:

cfclient.canvas

Device Detection 文档页面是这样写的:

cfclient.properties.canvas

繁荣。这当然就是全部了。真是浪费时间。如果您在其中添加“.properties”,所有 cfclient 范围的变量都可以正常工作。

我仍然不确定 cfclientsettings 文档是否完全错误,或者它是否在不同的上下文中引用它。我一定会在这一点上添加评论。

(此外,JavaScript 在两个文档版本上对于此示例仍然失败,所以就是这样。)

希望这对想要进行简单的 ColdFusion 客户端设备检测的人有所帮助。