javascript - 创建一个网络服务器控件来模仿 jquery 自动完成 API

标签 javascript jquery vb.net jquery-autocomplete custom-server-controls

我正在尝试为使用 jQuery auto-complete 的自动完成下拉菜单创建一个 ASP .Net (VB.Net) 自定义控件.

基本流程是控件的使用者将设置一些属性(例如数据源),然后将其作为 javascript 注入(inject)以初始化自动完成。

涉及到很多部分,所以我可能遗漏了一些代码,如果您认为缺少某些内容,请发表评论,我会添加它。

消费者背后的代码(PreInit 事件):

myDropDown.DataCallback = "testFunc";

控件中的 DataCallback 属性:

Public Property DataCallback As String

控制代码后面的选项对象创建和javascript注入(inject)(PreRender事件):

Dim _serializer As New JavaScriptSerializer()
Dim optionsObject As New Dictionary(Of String, Object)
optionsObject.Add("source", DataCallback)
Dim optionsJSON = _serializer.Serialize(optionsObject)

Dim initializeScript = String.Format("initialize('{0}', {1});", ClientID, optionsJSON)
Attributes.Add("onfocusin", initializeScript)

最后是 javascript:

var initialize = function (controlID, options) {
    if (options) {
        $('#' + controlID).autocomplete(options);
    }

    // remove the blur event handler that called this initialize function
    $('#' + controlID).removeAttr('onfocusin');
};

当我调试到 initialize 函数时,我看到 options 有一个属性,source,带有字符串 "testFunc" 因为它的值(value)。我需要的是 source 的值为 testFunc(不是字符串),因此它可以作为自动完成中的回调执行,而不是自动完成认为它是一个 URL .

最佳答案

纠正此问题的最简单方法是进行一些模式识别。出现问题是因为字符串属性被序列化为字符串并用引号引起来。相反,您希望它代表一个对象引用,这意味着去掉那些引号。要删除引号,可以将一个简单的正则表达式应用于序列化对象字符串:

Dim optionsJSON = _serializer.Serialize(optionsObject)
optionsJSON = Regex.Replace(optionsJSON , "(?<=""source"":)""(.+?)""", "$1")

这将执行的操作是查找以文本 "source": 开头的引用字符串,并捕获其中的内容以捕获组 #1。然后它将用内部文本替换整个匹配项,有效地删除回调函数名称两侧的引号。

关于javascript - 创建一个网络服务器控件来模仿 jquery 自动完成 API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10418800/

相关文章:

javascript - javascript 中 $.map 函数有什么用?

javascript - props.clickHandler 不是一个函数(ReactJS)

javascript - Google Charts 动态数组 PHP 不带 SQL

javascript - 使用js处理iframe时出错

javascript - 在 WordPress 主页中显示子页面,并带有缩略图、标题和页数限制

vb.net - 如何在 VB.net 中对 DataGridView 的列进行排序(字符串)

javascript - 按下按钮时动画滚动

c# - SqlBulkCopy 不工作,没有错误

vb.net - VB.NET 静态变量存储在哪里?

jquery - Bootstrap CSS - 图像容器高度匹配宽度