2

在 Firefox 扩展中验证首选项值的普遍接受的方法是什么,特别是在 XUL 中使用prefwindow机制时?

我在我的一个扩展中引入了一些新的首选项,我想在关闭首选项窗口之前验证这些首选项。如果有错误,应允许用户更正问题,然后继续。我看到该prefwindow元素有两个潜在有用的功能可以在这方面提供帮助:

前者似乎有一个相关的错误(错误 474527),阻止从该函数prefwindow返回时保持打开状态。false这很糟糕,因为它没有给用户立即纠正错误的机会。

后者似乎存在偏好在退出之前被保存的问题,这使得偏好在内部处于不良状态。

此外,该prefwindow机制还支持browser.preferences.instantApply在更新关联控件时立即写入首选项值的选项。这使得验证更加棘手。是否有一种干净的方法来验证 Firefox 扩展中的自定义首选项,允许用户纠正任何潜在的错误?

4

2 回答 2

2

通常,您希望在更改首选项时对其进行验证。这就是onchange属性(和相应的change事件)有利于:

<preference name="preference.name" onchange="validate(this);"/>

在首选项值更改后触发该事件。有两个缺点:

  • 如果instantApply新的偏好值已经被保存,来不及验证和拒绝。
  • 对于文本字段,每次输入新字符时都会保存首选项。如果您在用户仍在键入时报告验证失败,这将变得很难看。

您可以通过拦截实际输入字段的更改事件来解决第一个问题。例如,对于文本字段,您可以:

<input preference="preference.name"
    oninput="if (!validate(this)) event.stopPropagation();"
    onchange="if (!validate(this)) { event.stopPropagation(); this.focus(); }"/>

因此,未正确验证的更改不会冒泡到<prefpane>元素并且不会被保存。要监听的事件是:对于文本字段,对于按钮和复选框,input对于元素。changecommandselect<colorpicker>

第二个问题很棘手。您仍然希望在输入发生时验证输入,但是立即显示消息将是糟糕的 UI。我认为最好的解决方案是最初假设每个输入字段仍在“进行中”。blur当您第一次看到该字段上的事件时,您只会设置一个值已完成的标志。那时您可以在必要时显示验证消息(理想情况下,您的首选项页面中会显示红色文本,而不是模式提示)。

所以要指出最终解决方案的样子(未经测试的代码,但我过去使用过类似的东西):

<description id="error" hidden="true">Invalid preference value</description>

<input preference="preference.name"
    _errorText="error"
    onblur="validate(event);"
    oninput="validate(event);"
    onchange="validate(event);/>

<script>
  function validate(event)
  {
    // Perform actual validation
    var field = event.target;
    var valid = isValid(field);

    // If this is the blur event then the element is no longer "in progress"
    if (event.type == "blur")
    {
      field._inputDone = true;
      if (!valid)
        field.focus();
    }

    // Prevent preferences changing to invalid value
    if (!valid)
      event.stopPropagation();

    // Show or hide error text
    var errorText = document.getElementById(field.getAttribute("_errorText"));
    errorText.hidden = valid || !field._inputDone;
  }
</script>
于 2012-10-10T11:58:40.493 回答
1

如果您想在字段更改后立即验证值以便处理这种instantApply情况,您可以挂钩各个字段的更改事件(例如oninputa textbox)。如果值无效,则显示错误消息并强制将焦点返回到该字段。您可以自动将其设置回有效值,也可以阻止用户关闭对话框,直到它被修复。

于 2012-10-10T07:29:26.427 回答