在 Visualforce Pages 中使用 JavaScript

在 Visualforce 中使用 JavaScript 页面允许您访问各种现有的 JavaScript 功能,例如 JavaScript 库,以及自定义页面功能的其他方法。操作标记(如 和 )支持 Ajax 请求。

<apex:actionFunction><apex:actionSupport>

警告

通过在页面中包含 JavaScript,您可以引入 使用 Visualforce 时没有的跨浏览器和维护问题。在编写任何 JavaScript 之前, 您应该确保没有现有的 Visualforce 组件可以解决您的 问题。在 Visualforce 页面中包含 JavaScript 的最佳方法是将 JavaScript 放在静态资源中,然后调用 它从那里开始。例如

<apex:includeScript value="{!$Resource.MyJavascriptFile}"/>

然后,您可以使用该 JavaScript 文件中定义的函数 在您的页面中使用标签。

<script>

提示

在表达式中使用 JavaScript 时,需要 使用反斜杠 (\) 对引号进行转义。例如

onclick="{!IF(false, 'javascript_call(\"js_string_parameter\")', 'else case')}"

使用 $Component JavaScript 中的参考组件

使用全局变量简化 引用为 Visualforce 组件生成的 DOM ID,并减少对整个页面的一些依赖 结构。

$Component

每个 Visualforce 标签都有一个属性。一个标签的属性可以由另一个标签用来绑定这两个标签 一起。例如,标签的属性可以与标签的属性一起使用。、 和其他面向操作的 和 属性 组件还使用其他组件的属性值。idid<apex:outputLabel>for<apex:inputField>idreRenderstatus<apex:actionFunction><apex:actionSupport>id

除了用于将 Visualforce 组件绑定在一起外,此 ID 还用于构成文档的一部分 呈现页面时组件的对象模型 (DOM) ID。

要在 JavaScript 或其他支持 Web 的语言中引用 Visualforce 组件,您必须 为该组件的属性指定一个值。DOM ID 由组合构成 的属性 组件和属性 包含该元素的所有组件。ididid

组件访问示例

以下示例将 DOM ID 用于标记。该页面包含两个面板:第一个面板 持有一个触发 DOM 事件的复选框,第二个复选框包含一些文本 为响应事件而更改。<apex:outputPanel>

页面顶部包括 JavaScript 包含在 HTML 标记中。它将触发事件的元素作为参数 () 和包含要影响文本的目标面板的 DOM ID()。<script>inputtextid

<apex:page id="thePage">
    <!-- A simple function for changing the font. -->
    <script>
        function changeFont(input, textid) {
            if(input.checked) {
                document.getElementById(textid).style.fontWeight = "bold";
            }
            else {
                document.getElementById(textid).style.fontWeight = "normal";
            }
        }
    </script>

    <!-- This outputPanel calls the function, passing in the
         checkbox itself, and the DOM ID of the target component. -->
    <apex:outputPanel layout="block">
        <label for="checkbox">Click this box to change text font:</label>
        <input id="checkbox" type="checkbox"
            onclick="changeFont(this,'{!$Component.thePanel}');"/>
    </apex:outputPanel>

    <!-- This outputPanel is the target, and contains 
         text that will be changed. -->
    <apex:outputPanel id="thePanel" layout="block">
        Change my font weight!
    </apex:outputPanel>
</apex:page>

该表达式用于获取 组件生成的 HTML 元素的 DOM ID。{!$Component.thePanel}<apex:outputPanel id=”thePanel”>

将 JavaScript 库与 Visualforce 结合使用

您可以在 Visualforce 页面中包含 JavaScript 库,以利用 这些库提供的功能。包含 JavaScript 库的最佳方式是 创建静态资源,然后通过向页面添加组件来包含库。

<apex:includeScript>例如,如果您使用的是 jQuery (https://js.foundation/),请从名为 jquery 的库创建静态资源,然后在类似 这:

<apex:page>
    <apex:includeScript value="{!$Resource.jquery}"/>
</apex:page>

你 然后,可以通过添加 to 调用在页面中使用它 函数。

<script>如果您在 Visualforce 页面中使用 JavaScript 库,并且该库 定义为特殊字符,您需要 修改 JavaScript 以覆盖此用法。例如,使用 jQuery,您可以覆盖 通过使用函数的定义。

$$jQuery.noConflict()

<apex:page >
<apex:includeScript value="{!$Resource.jquery}"/>
<html>
<head>
  <script>
    jQuery.noConflict();
    
    jQuery(document).ready(function() {    
        jQuery("a").click(function() {
          alert("Hello world, part 2!");
        });
    });
  </script>
</head>
...
</apex:page>

注意

  • 支持并鼓励使用第三方 JavaScript 库和框架 由 Salesforce 提供。但是,Salesforce 无法帮助您调试 JavaScript 代码,除非它 特别是与Salesforce功能有关。
  • 不要在使用 Chatter 组件、 、 或 .<apex:enhancedList><knowledge:articleCaseToolbar><knowledge:articleRendererToolbar>

适用于 Apex 的 JavaScript 远程处理 控制器

在 Visualforce 中使用 JavaScript 远程处理来调用 来自 JavaScript 的 Apex 控制器。创建具有复杂、动态行为的页面,但事实并非如此 可以使用标准的 Visualforce AJAX 组件。使用 JavaScript 远程处理实现的功能需要三个元素:

  • 您添加到 Visualforce 页面的远程方法调用,写在 JavaScript的。
  • Apex 控制器类中的远程方法定义。此方法 定义是用 Apex 编写的,但与 正常操作方法。
  • 您添加到或包含在 Visualforce 中的响应处理程序回调函数 页面,用 JavaScript 编写。

什么是 JavaScript Remoting?

JavaScript 远程处理是一种工具,可以 前端开发人员可以使用从 Visualforce 页面直接向 Apex 发出 AJAX 请求 控制器。JavaScript 远程处理允许您 通过将页面与控制器分离来运行异步操作,并在 页面,而无需重新加载整个页面。

此外,JavaScript 远程处理还可以提供帮助 缓解视图状态问题,同时仍在用户查看页面的上下文中执行。 JavaScript 远程处理是最有效的方法 调用控制器并从页面传入数据,因为您可以确保 每次进行调用时仅传递所需的数据。

何时使用 JavaScript 远程处理

JavaScript 远程处理是 针对移动网页和使用第三方 JavaScript 的网页进行了优化 图书馆。它支持动态的交互式页面,感觉比 传统 Visualforce 页面。

JavaScript 远程处理是 标准 Visualforce AJAX 组件和 Visualforce Remote 对象。它 提供了一种更惯用的方式,通过 JavaScript 与 Lightning 平台进行交互。JavaScript 远程处理允许您使用熟悉的 JavaScript 实践和结构,并利用其他 JavaScript 框架和工具 对于前端开发人员来说,套件更轻松。远程处理可创建响应速度更快的理想体验 对于移动页面或您的用例需要最高效率的任何其他页面,以及 性能。由于它是异步的,因此只能加载初始页面和 需要显示页面,然后延迟加载页面上可能未使用的其他数据 马上。您甚至可以使用此方法为用户的页面或视图预加载数据 尚未访问。

虽然 JavaScript 远程处理 可以提供高效、响应迅速且优化的用户体验,但事实并非如此 无限制。开发使用它的页面可能需要额外的时间,而您 需要改变你开发和思考页面流程的方式。因为你 未使用表单,并且没有与请求关联的视图状态,您有 在客户端自行管理页面的状态。另一方面 没有什么可以阻止您将 JavaScript 远程处理与 标准 Visualforce MVC 设计范式。一如既往,把你试图解决的问题放在首位 在确定您的设计时。JavaScript 远程处理是众多远程处理之一 可用的工具。

比较 JavaScript Remoting 和 <apex:actionFunction>

该组件还允许 通过 JavaScript 调用控制器操作方法。

<apex:actionFunction>

一般来说,更容易使用 并且需要更少的代码,而 JavaScript 远程处理提供了更大的灵活性。<apex:actionFunction>以下是两者之间的一些具体区别。

  • 标签:<apex:actionFunction>
    • 允许您指定重新渲染目标
    • 提交表格
    • 不需要你编写任何 JavaScript
  • JavaScript 远程处理:
    • 允许您传递参数
    • 提供回调
    • 需要你编写一些 JavaScript

比较 JavaScript 远程处理和远程处理 对象

JavaScript 远程处理和远程 对象提供类似的功能,两者都是用于创建动态响应式页面的有用工具。 它们有一些重要的区别,在选择哪个之前,您应该考虑这些差异 用。

一般来说,远程 Objects 非常适合只需要执行简单的 Create-Read-Update-Delete 或 “CRUD”,对象访问。JavaScript Remoting 更适合 到访问更高级别服务器操作的页面。远程 Objects 可让您快速启动和运行,而无需太多仪式,而 JavaScript Remoting 适合 更复杂的应用程序,需要一些前期 API 样式的设计工作。视觉力 远程 对象:

  • 使基本的“CRUD”对象访问变得容易
  • 不需要任何 Apex 代码
  • 支持最小的服务器端应用程序逻辑
  • 不提供自动关系遍历;您必须查找相关对象 你自己

JavaScript 远程处理:

  • 需要 JavaScript 和 Apex 代码
  • 支持复杂的服务器端应用程序逻辑
  • 更好地处理复杂的对象关系
  • 更有效地(甚至)使用网络连接

将 JavaScript 远程处理添加到 Visualforce 页面

要在 Visualforce 页面中使用 JavaScript 远程处理,请将请求添加为 JavaScript 函数调用。将 Apex 类作为自定义控制器或控制器扩展添加到 你 页。

<apex:page controller="MyController" extension="MyExtension">

警告

添加控制器或控制器扩展将授予对该 Apex 类中所有方法的访问权限,即使这些方法 页面中不使用方法。任何可以查看该页面的人都可以执行所有方法,并向 控制器。@RemoteAction@RemoteAction然后,将请求添加为 JavaScript 函数调用。一个简单的 JavaScript 远程调用采用以下方法 形式。

[namespace.]MyController.method(
    [parameters...,]
    callbackFunction,
    [configuration]
);
元素描述
namespace控制器类的命名空间。如果出现以下情况,则 namespace 元素是必需的 您的组织定义了一个命名空间,或者该类是否来自已安装的 包。
MyController,MyExtensionApex 控制器或扩展的名称。
method要调用的 Apex 方法的名称。
parameters方法采用的参数的逗号分隔列表。
callbackFunction处理来自 控制器。还可以以内联方式声明匿名函数。 接收方法的状态 调用和结果作为参数。callbackFunction
configuration配置远程呼叫和响应的处理。使用此元素可以 更改远程处理调用的行为,例如是否转义 Apex 方法的响应。

远程方法调用同步执行,但不会等待响应 返回。当响应返回时,回调函数会异步处理它。有关详细信息,请参阅处理远程响应。

配置 JavaScript 远程处理请求

通过在以下情况下为对象提供配置设置来配置远程处理请求 声明远程处理请求。例如,默认配置参数如下所示 这:

{ buffer: true, escape: true, timeout: 30000 }

这些 配置参数没有顺序,您可以省略不想更改的参数 从默认值。JavaScript 远程处理支持以下功能 配置参数:

名字数据类型描述
缓冲区布尔是否将时间上彼此靠近执行的请求分组到单个请求中。 缺省值为 。trueJavaScript 远程处理 优化在时间上彼此接近执行的请求,并将调用分组到 单个请求。这种缓冲提高了整体请求和响应的效率 循环,但有时确保所有请求都执行很有用 独立地。
布尔是否转义 Apex 方法的响应。缺省值为 。true
超时整数请求的超时时间(以毫秒为单位)。默认值为 30,000 (30 秒)。最大值为 120,000 (120 秒,或 2 分钟)。

还可以为页面发出的所有请求配置请求超时,方法是将 使用 Visualforce 远程处理超时 对象:

<script type="text/javascript">

    Visualforce.remoting.timeout = 120000; // Set timeout at page level

    function getRemoteAccount() {
        var accountName = document.getElementById('acctSearch').value;

        // This remoting call will use the page's timeout value
        Visualforce.remoting.Manager.invokeAction(
            '{!$RemoteAction.AccountRemoter.getAccount}',
            accountName, 
            handleResult
        );
    }

    function handleResult(result, event) { ... }
</script>

通过在 该请求的配置对象,如上所述。

命名空间和 JavaScript 远程处理

您可以使用全局 自动解析远程操作的正确命名空间(如果有)。这使得它 更易于使用命名空间,尤其是对于对方法进行远程处理调用的页面 以包装形式提供。

$RemoteAction若要使用此工具,必须显式调用 JavaScript 远程处理。 执行此操作的模式 是:

Visualforce.remoting.Manager.invokeAction(
    'fully_qualified_remote_action', 
     invocation_parameters
);

完全限定的远程操作是一个字符串,表示 远程操作方法的完整路径,包括命名空间、基类等:. 在表达式中自动使用 解析命名空间,例如 .namespace[.BaseClass][.ContainingClass].ConcreteClass.Method$RemoteAction{!$RemoteAction.MyController.getAccount}调用参数是用于执行 远程方法调用,并且是用于进行标准远程处理调用的相同参数:

  • 要发送到方法的参数, 如果有的话。@RemoteAction
  • 回调函数,用于处理返回的结果。
  • 调用的配置详细信息(如果有)。

例如,您可以定义一个远程调用来检索 帐户喜欢 这:

<script type="text/javascript">
function getRemoteAccount() {
    var accountName = document.getElementById('acctSearch').value;

    Visualforce.remoting.Manager.invokeAction(
        '{!$RemoteAction.MyController.getAccount}', 
        accountName, 
        function(result, event){
            if (event.status) {
                document.getElementById('acctId').innerHTML = result.Id
                document.getElementById('acctName').innerHTML = result.Name;
            } else if (event.type === 'exception') {
                document.getElementById("responseErrors").innerHTML = event.message;
            } else {
                document.getElementById("responseErrors").innerHTML = event.message;
            }
        }, 
        {escape: true}
    );
}
</script>

这 JavaScript 远程处理调用不需要知道命名空间的详细信息,其中 控制器是定义的,无论是在你自己的命名空间中,还是在 已安装的软件包。它还可以处理您的组织没有 命名空间定义。

注意

调用时遇到的错误是 仅在 JavaScript 控制台中报告。例如,如果在多个命名空间中找到匹配的方法,则返回第一个匹配方法,并将警告记录到 JavaScript 控制台。如果未找到匹配的控制器或操作,则调用将失败,并且 错误将记录到 JavaScript 控制台。invokeAction$RemoteAction@RemoteAction

JavaScript 远程处理的 OAuth 2.0 身份验证

您可以使用 OAuth 2.0 对 JavaScript 远程处理请求进行身份验证,而不是要求 标准的用户名和密码登录过程。OAuth 允许跨应用程序和 使用标准无法安全地完成的跨组织集成 认证。

使用 OAuth 的 Visualforce 页面 身份验证在页面级别对其进行配置,并将 OAuth 用于所有 JavaScript 远程处理请求。以外 配置,使用 JavaScript 远程处理是 完全一样。为 JavaScript 远程处理配置 OAuth 从 Visualforce 页面获取 以后 形式:

<script type="text/javascript">

    Visualforce.remoting.oauthAccessToken = <access_token>;

    // ...
</script>

设置后,所有 JavaScript 远程处理请求都使用 OAuth。其余的 的 JavaScript 远程处理代码可以保留 相同。

oauthAccessToken

oauthAccessToken是 OAuth 身份验证令牌 由页面代码获取。获取和更新访问令牌是简单的 OAuth, 加一个。JavaScript 远程处理 OAuth 身份验证请求“VisualForce”范围,因此必须使用此令牌或 包含它的范围,包括“web”或“full”。在 OAuth 请求中设置(或“web”或“full”)。scope=visualforce

有关获取访问令牌以及将 OAuth 与 Lightning 平台结合使用的信息,请参阅《对远程访问应用程序进行身份验证》和《深入了解 OAuth 2.0》 Salesforce 联机帮助中的 Salesforce。

在 Apex 中声明远程方法

您几乎可以将任何 Apex 方法作为 JavaScript 远程处理远程操作调用。为此, 方法需要遵循一些简单的规则。在控制器中,Apex 方法声明前面有 注释喜欢 这:

@RemoteAction

@RemoteAction
global static String getItemId(String objectName) { ... }

Apex 方法必须是 和 或 。

@RemoteActionstaticglobalpublic

您的方法可以采用 Apex 基元、集合、类型化 和泛型 sObjects,以及用户定义的 Apex 类和接口作为参数。通用 sObjects 必须具有 ID 或 sobjectType 值才能标识实际类型。接口参数必须 有一个 apexType 来标识实际类型。

您的方法可以返回 Apex 基元、sObjects、 集合、用户定义的 Apex 类和枚举、 、 、 或 。SaveResultUpsertResultDeleteResultSelectOptionPageReference用于 JavaScript 远程处理的方法必须由名称和编号唯一标识 参数;无法重载。例如,使用上述方法,您不能同时拥有 一种方法。相反 声明具有不同名称的多个方法:

getItemId(Integer productNumber)

  • getItemIdFromName(String objectName)
  • getItemIdFromProductNumber(Integer productNumber)

@RemoteAction方法的范围和可见性

Apex 方法必须是 和 或 。@RemoteActionstaticglobalpublic不要使用全局公开的远程操作来执行敏感操作或公开 非公开数据。 远程操作只能调用 其他方法。您不能使用公共遥控器 组件或作用域中的操作。范围升级会导致编译器错误,或者 对于在运行时解析的引用,则为运行时失败。下表描述了这些限制。

Globalglobalglobalglobal

@RemoteAction范围Visualforce 页面非全局组件全局组件iframe跨包访问
全局远程方法允许允许允许允许允许
公共远程方法允许允许错误错误包必须共享命名空间。方法必须具有注释。@namespaceAccessible

注意

如果 @RemoteAction 方法位于托管包中并由 Visualforce Remoting 使用,则它必须 如果使用用户配置文件或权限集访问权限,则具有全局可见性。什么时候 远程操作通过标记访问,它们通过组件、或标记间接包含。远程方法的作用域是 结转到顶级容器(包含层次结构中的顶级项)中, 必须遵守范围升级规则。

<apex:include>,<apex:composition>

顶级容器
@RemoteAction访问自Visualforce 页面非全局组件全局组件iframe
全局组件允许允许允许允许
非全局组件允许允许仅当非全局组件不包括公共远程方法时才允许。仅当非全局组件不包括公共远程方法时才允许。
<apex:include> <apex:composition>允许在同一命名空间中;如果命名空间不同且包含的命名空间不同,则出错 Page 或其子层次结构包含公共远程方法。不适用不适用错误

远程方法和继承

您可以在 Apex 控制器上调用继承方法的远程操作。什么时候 查找或调用方法时,Visualforce 会检查页面 控制器的继承层次结构,并在控制器的祖先类中查找方法。

@RemoteAction@RemoteAction下面是一个演示此功能的示例。以下 Apex 类构成一个 三层继承 等级制度:

global with sharing class ChildRemoteController 
    extends ParentRemoteController { }
global virtual with sharing class ParentRemoteController 
    extends GrandparentRemoteController { }

global virtual with sharing class GrandparentRemoteController {
    @RemoteAction
    global static String sayHello(String helloTo) {
        return 'Hello ' + helloTo + ' from the Grandparent.';
    }
}

此 Visualforce 页面只需调用 遥控器 行动。

sayHello

<apex:page controller="ChildRemoteController" >
    <script type="text/javascript">
        function sayHello(helloTo) {
            ChildRemoteController.sayHello(helloTo, function(result, event){
                if(event.status) {
                    document.getElementById("result").innerHTML = result;
                }
            });
        }
    </script>

    <button onclick="sayHello('Jude');">Say Hello</button><br/>
    <div id="result">[Results]</div>
    
</apex:page>

这 类中不存在 Remote 方法。相反,它继承自 .

ChildRemoteControllerGrandparentRemoteController

使用接口参数声明远程方法

您可以使用以下命令声明方法 接口参数和返回类型,而不是局限于具体类。这,为了 例如,允许包提供程序打包远程方法和关联的接口,其中 订阅者组织可以从 Visualforce 页面调用,并传入自己的类 实现打包接口。

@RemoteAction这是一个简短的 例:

public class RemoteController {
    public interface MyInterface { String getMyString(); }
    public class MyClass implements MyInterface { 
        private String myString; 
        public String getMyString() { return myString; }
        public void setMyString(String s) { myString = s; }
    }
    
    @RemoteAction
    public static MyInterface setMessage(MyInterface i) {
        MyClass myC = new MyClass();
        myC.setMyString('MyClassified says "' + i.getMyString() + '".');
        return myC;
    }
}

从 JavaScript 远程处理调用发送到声明接口参数的对象必须包含一个值,该值必须是指向 具体类,即 . 例如,要对上述内容进行 JavaScript 远程处理调用 控制器:

@RemoteActionapexTypenamespace[.BaseClass][.ContainingClass].ConcreteClass

Visualforce.remoting.Manager.invokeAction(
    '{!$RemoteAction.RemoteController.setMessage}',
    {'apexType':'thenamespace.RemoteController.MyClass', 'myString':'Lumos!'}, 
    handleResult
);

如果类定义位于您的组织内,则可以 简化远程处理调用,并使用默认命名空间:

c

RemoteController.setMessage(
    {'apexType':'c.RemoteController.MyClass', 'myString':'Lumos!'}, 
    handleResult
);

处理远程响应

异步处理对远程方法调用的响应 遥控器 方法回调 功能。您的回调函数接收 这 以下参数:

  • event表示 远程呼叫
  • result远程 Apex 返回的对象 方法。

你 函数可以根据数据更新页面上的信息和用户界面元素 返回。该对象提供允许您执行操作的值 在远程调用成功或失败时。

event

描述
event.statustrue成功时,错误时。false
event.type响应的类型:for a 调用成功,如果远程 方法抛出异常。rpcexception
event.message包含返回的任何错误消息。
event.where这 顶点 叠 trace 是 引用 如果它是由远程生成的 方法。

返回的 Apex 基元数据类型,例如 字符串或数字 – 转换为其 JavaScript 等效项。顶点对象 返回的对象将转换为 JavaScript 对象,而集合将转换为 JavaScript 数组。请记住,JavaScript 区分大小写,因此 、 和 被视为不同的字段。resultidIdID

作为 JavaScript 远程调用的一部分,如果 Apex 方法响应包含对 相同 对象。 这 对象是 不 在返回的 JavaScript 对象中重复。 相反 呈现的 JavaScript 对象包含 一个 参考 到同一个对象。一个示例是 Apex 方法,它返回一个包含相同 对象两次。

了解日期和时间序列化

日期和时间值在通过 Visualforce 传递时被序列化为纪元时间 远程处理。

Date, , 从函数返回的对象被序列化为长整数。DateTimeTimeRemoteAction

序列化日期时间值

[{
    "statusCode": 200,
    "type": "rpc",
    "tid": 8,
    "ref": false,
    "action": "DateTestController",
    "method": "add",
    "result": 1432047600000
}]

调试 JavaScript 远程处理

调试使用 JavaScript 远程处理的页面需要调试 Visualforce、Apex 和 JavaScript的。

重要

使用 JavaScript 远程处理时,在开发过程中保持 JavaScript 控制台处于打开状态。错误和 JavaScript 远程处理遇到的异常将记录到 JavaScript 控制台(如果已启用),否则会以静默方式忽略。

当方法引发异常时 由于编程错误或其他故障,Apex 堆栈跟踪将返回到 对象中的浏览器。检查 堆栈跟踪在 JavaScript 调试器控制台中,或将其用于 响应回调函数。@RemoteActionevent下面是一个回调函数,当有 例外。

<script type="text/javascript">
function getRemoteAccount() {
    var accountName = document.getElementById('acctSearch').value;

    Visualforce.remoting.Manager.invokeAction(
        '{!$RemoteAction.MyController.getAccount}', 
        accountName, 
        function(result, event){
            if (event.status) {
                document.getElementById('acctId').innerHTML = result.Id
                document.getElementById('acctName').innerHTML = result.Name;
            } else if (event.type === 'exception') {
                document.getElementById("responseErrors").innerHTML = 
                    event.message + "<br/>\n<pre>" + event.where + "</pre>";
            } else {
                document.getElementById("responseErrors").innerHTML = event.message;
            }
        }
    );
}
</script>

JavaScript 远程处理限制和 考虑

尽管 JavaScript 远程处理不受某些资源限制的约束,但它还有其他资源限制 限制。

JavaScript 远程处理无法避免 Salesforce 服务限制。JavaScript 远程处理调用不是 受 API 限制的约束,但使用 JavaScript 远程处理的 Visualforce 页面受所有 标准 Visualforce 限制。

默认情况下,远程呼叫响应必须在30 秒,之后调用超时。如果您的请求需要更长的时间才能完成, 配置更长的超时时间,最多 120 秒。

这 请求(包括标头)的最大大小为 4 MB。远程呼叫响应最大大小为

15兆字节.如果你的 JavaScript 远程处理代码超出此限制,您有多种选择。

  • 减小每个请求的响应大小。仅返回以下数据 必填。
  • 将大数据检索分解为返回较小块的请求。
  • 若要减小批处理大小,请更频繁地发出批处理请求。
  • 使用非批处理请求。在远程处理请求配置块中设置。{ buffer: false }

Salesforce 会记录某些 JavaScript 远程处理调用中的错误消息。您可以防止个人 由于未在错误消息中包含客户数据而记录的信息。相反,抓住 异常并记录完整消息。然后向 Visualforce 返回一条用户友好的消息 页。

发出 Visualforce Remoting 请求时,将使用 “会话设置设置”页面中的组织范围超时值。超时未刷新 后续请求。如果不需要超时,则可以使用用户配置文件访问权限或 权限集访问权限。

JavaScript 远程处理 例

下面是一个基本示例,演示如何在 Visualforce 页面中使用 JavaScript 远程处理。首先,创建一个名为 Apex 的控制器:

AccountRemoter

global with sharing class AccountRemoter {

    public String accountName { get; set; }
    public static Account account { get; set; }
    public AccountRemoter() { } // empty constructor
    
    @RemoteAction
    global static Account getAccount(String accountName) {
        account = [SELECT Id, Name, Phone, Type, NumberOfEmployees 
                   FROM Account WHERE Name = :accountName];
        return account;
    }
}

其他 比注释,这看起来 与任何其他控制器定义一样。

@RemoteAction要使用此远程方法,请创建一个如下所示的 Visualforce 页面 这:

<apex:page controller="AccountRemoter">
    <script type="text/javascript">
    function getRemoteAccount() {
        var accountName = document.getElementById('acctSearch').value;

        Visualforce.remoting.Manager.invokeAction(
            '{!$RemoteAction.AccountRemoter.getAccount}',
            accountName, 
            function(result, event){
                if (event.status) {
                    // Get DOM IDs for HTML and Visualforce elements like this
                    document.getElementById('remoteAcctId').innerHTML = result.Id
                    document.getElementById(
                        "{!$Component.block.blockSection.secondItem.acctNumEmployees}"
                        ).innerHTML = result.NumberOfEmployees;
                } else if (event.type === 'exception') {
                    document.getElementById("responseErrors").innerHTML = 
                        event.message + "<br/>\n<pre>" + event.where + "</pre>";
                } else {
                    document.getElementById("responseErrors").innerHTML = event.message;
                }
            }, 
            {escape: true}
        );
    }
    </script>

    <input id="acctSearch" type="text"/>
    <button onclick="getRemoteAccount()">Get Account</button>
    <div id="responseErrors"></div>

    <apex:pageBlock id="block">
        <apex:pageBlockSection id="blockSection" columns="2">
            <apex:pageBlockSectionItem id="firstItem">
                <span id="remoteAcctId"/>
            </apex:pageBlockSectionItem>
            <apex:pageBlockSectionItem id="secondItem">
                <apex:outputText id="acctNumEmployees"/>
            </apex:pageBlockSectionItem>
        </apex:pageBlockSection>
    </apex:pageBlock>
</apex:page>

通知 关于此标记的以下内容:

  • JavaScript 使用显式远程处理调用,并利用全局来解析正确的 远程操作方法的命名空间。invokeAction$RemoteAction
  • 仅当调用成功时,该变量才可用。错误 示例所示的处理特意简单,并打印错误 分别来自 和 值的消息和堆栈跟踪。我们鼓励你实现更可靠的 方法调用未调用的请求的替代逻辑 成功。event.statustrueevent.messageevent.where
  • 该变量表示 从 Apex 方法返回的对象。resultgetAccount
  • 访问纯 HTML 元素的 DOM ID 很简单,只需使用 项目。
  • Visualforce 的 DOM ID 组件是动态生成的,以确保 ID 是唯一的。代码 以上使用了使用$Component 从 JavaScript 引用组件,通过全局变量访问组件来检索组件的 ID。$Component

常见 Visualforce JavaScript 远程处理 API 验证 错误

了解如何更正对 Visualforce JavaScript Remoting 的常见无效调用 应用程序代码中的 API。

以下错误消息适用于 Apex 控制器验证:

  • Apex 命名空间 “” 中的具体实现 “” 接口 “” 没有权限 要使用。无法实例化 Apex 对象。CLASSNAMESPACEMETHOD_PARAMETER
    • 反序列化对象没有权限 在关联的命名空间中使用。查看 Apex 类删除不兼容的注释或 满足必须满足的缺失安全要求 满意。
  • 命名空间 “” 中的具体实现 “” 没有 实现 Apex 接口 “.” 无法实例化 Apex 对象。CLASSNAMESPACEMETHOD_PARAMETER
    • 确保反序列化的数据类型 Apex 对象与输入参数类型相同 Apex 控制器方法所期望的。

这些错误消息适用于 CSRF 令牌验证:

  • 远程处理请求的授权无效。请稍后再试。
    • 检查CSRF令牌是否成功发行。 如果需要,请请求另一个令牌。
  • 远程处理请求授权已过期。刷新页面,然后重试。
    • CSRF 令牌已过期。请求另一个 令牌,然后对请求使用新令牌。
  • 无法授权远程处理请求。刷新页面并 再试一次。
    • CSRF 令牌期间发生意外故障 验证。查看控制台日志和服务器 日志以识别故障点并确定 如何更正问题。
  • 远程处理请求授权对请求的方法无效。
    • 确认 CSRF 令牌有效。然后 确保 CSRF 令牌用于 与发布验证的方法相同。
  • 您没有执行 您请求的操作。请联系所有者 记录或您的管理员(如果需要访问)。
    • 通过令牌或授权进行访问 不成功,但没有任何信息 关于授权失败的原因。检查 控制台日志和服务器日志,用于提供有关 如何更正问题。
  • 授权远程处理请求时出错。刷新 页面,然后重试。
    • 验证期间发生不明问题。 确认您的访问权限有效,然后检查 控制台日志和服务器日志,用于提供有关 如何更正问题。