检查包含字符串的 li 项时,我的混合应用程序不会更改页面

     2023-03-07     289

关键词:

【中文标题】检查包含字符串的 li 项时,我的混合应用程序不会更改页面【英文标题】:My hybrid app wont change pages when checking li item which contains a string 【发布时间】:2017-01-02 13:32:07 【问题描述】:

对于我正在进行的项目,我想让我的混合应用程序(phonegap)在应用程序检测到来自 Arduino 的 BluetoothLE 信号时切换屏幕。为此,我通过几个列表项进行了代码循环,并且检查 li 项的内容与“TEST123”(我给 Arduino 的名称)相同。如果这些相同,则应用程序应切换到另一个页面。我在 GitHub 上编辑了名为“cordova-plugin-ble-central”的代码,由 Don Coleman 制作。

我编写了代码,因此它可以滚动浏览 ul 中的 li 项目,读取内容并在字符串与“TEST123”相同的情况下调用连接函数,但我的页面似乎没有切换。

感谢您的帮助!

HTML:

    <body>
    <div class="app">

        <h1>BluefruitLE</h1>
        <div id="mainPage" class="show">

            <ul id="deviceList">                    
            </ul>
            <button id="refreshButton">Refresh</button>

        </div>

        <div id="detailPage" class="hide">

            <div id="resultDiv"></div>
            <div>
                <input type="text" id="messageInput" value="Hello"/>
                <button id="sendButton">Send</button>                    
            </div>
            <button id="disconnectButton">Disconnect</button>

        </div> 

    </div>


    <script type="text/javascript" src="cordova.js"></script>
    <script type="text/javascript" src="js/index.js"></script>
    <script type="text/javascript">
        app.initialize();
    </script>
</body>

CSS:

     body 
        font-family: "Helvetica Neue";
        font-weight: lighter;
        color: #2a2a2a;
        background-color: #f0f0ff;

        -webkit-appearance: none;  
        -webkit-touch-callout: none;
        -webkit-tap-highlight-color: rgba(0,0,0,0); 

        -webkit-touch-callout: none; -webkit-user-select: none;
    

    button 
        margin: 15px;
        -webkit-appearance:none;    
        font-size: 1.2em;
    

    #mainPage 
        text-align:center;
        width: 100vw;
        height: 100vh;
    

    #detailPage 
        text-align:center;
        font-size: 2em;
        width: 100vw;
        height: 100vh;
        background-color: red;
    

button 
    -webkit-appearance: none;
    font-size: 1.5em;
    border-radius: 0;


#resultDiv 
    font: 16px "Source Sans", helvetica, arial, sans-serif;
    font-weight: 200;
    display: block;
    -webkit-border-radius: 6px;
    width: 100%;
    height: 140px;
    text-align: left;    
    overflow: auto;


#mainPage.show
    display: block;


#mainPage.hide
    display: none;


#detailPage.show
    display: block;


#detailPage.hide
    display: none;

当然还有我的 JavaScript:

'use strict';

// ASCII only
function bytesToString(buffer) 
    return String.fromCharCode.apply(null, new Uint8Array(buffer));


// ASCII only
function stringToBytes(string) 
    var array = new Uint8Array(string.length);
    for (var i = 0, l = string.length; i < l; i++) 
        array[i] = string.charCodeAt(i);
    
    return array.buffer;


// this is Nordic's UART service
var bluefruit = 
    serviceUUID: '6e400001-b5a3-f393-e0a9-e50e24dcca9e',
    txCharacteristic: '6e400002-b5a3-f393-e0a9-e50e24dcca9e', // transmit is from the phone's perspective
    rxCharacteristic: '6e400003-b5a3-f393-e0a9-e50e24dcca9e'  // receive is from the phone's perspective
;

var app = 
    initialize: function() 
        this.bindEvents();
        detailPage.hidden = true;
        //ale paginas hidden behalve login
    ,

    bindEvents: function() 
        document.addEventListener('deviceready', this.onDeviceReady, false);
        refreshButton.addEventListener('touchstart', this.refreshDeviceList, false);
        sendButton.addEventListener('click', this.sendData, false);
        disconnectButton.addEventListener('touchstart', this.disconnect, false);
        deviceList.addEventListener('touchstart', this.connect, false); // assume not scrolling
    ,

    onDeviceReady: function() 
        app.refreshDeviceList();
    ,

    refreshDeviceList: function() 
        deviceList.innerHTML = ''; // empties the list
        if (cordova.platformId === 'android')  // Android filtering is broken
            ble.scan([], 5, app.onDiscoverDevice, app.onError);
         else 
            ble.scan([bluefruit.serviceUUID], 5, app.onDiscoverDevice, app.onError);
        
    ,

    onDiscoverDevice: function(device) 
        var listItem = document.createElement('li'),
            html = '<b>' + device.name + '</b><br/>' +
                'RSSI: ' + device.rssi + '&nbsp;|&nbsp;' +
                device.id;

        listItem.dataset.deviceId = device.id;
        listItem.innerHTML = html;
        deviceList.appendChild(listItem);
    ,

    ulScroll: function() 
        var ul = document.getElementById("deviceList");
        var items = ul.getElementsByTagName("li");
            for (var i = 0; i < items.length; i++) 
                if ((items.textContent || items.innerText) == "TEST123")

                            connect: function(e) 
        var deviceId = e.target.dataset.deviceId,
            onConnect = function(peripheral) 
                app.determineWriteType(peripheral);

                // subscribe for incoming data
                ble.startNotification(deviceId, bluefruit.serviceUUID, bluefruit.rxCharacteristic, app.onData, app.onError);
                sendButton.dataset.deviceId = deviceId;
                disconnectButton.dataset.deviceId = deviceId;
                resultDiv.innerHTML = "";
                app.showDetailPage();
            ;

        ble.connect(deviceId, onConnect, app.onError);
    ,




    



    disconnect: function(event) 
        var deviceId = event.target.dataset.deviceId;
        ble.disconnect(deviceId, app.showMainPage, app.onError);
    ,

    showMainPage: function() 
        document.getElementById("mainPage").className = "show";
        document.getElementById("detailPage").className = "hide";
    ,

    showDetailPage: function() 
        document.getElementById("detailPage").className = "show";
        document.getElementById("mainPage").className = "hide";
    ,

    onError: function(reason) 
        alert("ERROR: " + reason);
    

;

附:非常抱歉没有组织的代码

【问题讨论】:

connect:function(e) 在函数内部应该做什么?那是对象语法!! 我对此比较陌生,您能解释一下您的意思吗?我猜是我应该在那里调用函数并将connect:函数放在函数之外 deviceList 未定义,对我来说,将函数输出写入 html,然后从中解析回来是没有意义的。这不符合所有逻辑...... 整个结构没有意义,可以从头重写,学好js再写copy+paste代码... 将函数输出到 html 是我们在课堂上的想法,这对我来说也很奇怪。 deviceList 是我从 github 编辑的代码中获得的。我看不出它做了什么,并想出了一个解决方案 【参考方案1】:

我将如何构建代码:

var app=
  devices:[], //thats were the devices are stored
  onDeviceReady:refreshDeviceList,

  refreshDeviceList: function() 
     deviceList.innerHTML = ''; // empties the list
     this.devices=[];
     if (cordova.platformId === 'android')  // Android filtering is broken
          ble.scan([], 5, app.onDiscoverDevice, app.onError);
      else 
         ble.scan([bluefruit.serviceUUID], 5, app.onDiscoverDevice, app.onError);
     
     //all devices checked, lets search ours:
     var my=this.devices.find(device =>  device.name=="TEST123");
     if(my)
          ble.connect(my.id,app.onconnect,errorhandling);
     else
        alert("my device not found");
    
   ,


   onDiscoverDevice: function(device) 
   //add to html
    var listItem = document.createElement('li'),
        html = '<b>' + device.name + '</b><br/>' +
            'RSSI: ' + device.rssi + '&nbsp;|&nbsp;' +
            device.id;
    listItem.innerHTML = html;
    deviceList.appendChild(listItem);
   //add to devices:
  this.devices.push(device);
   ,
   onconnect:function(e)
      //your connect function
   
  

补充说明:

  refreshButton etc are undefined. You need to find them:
 var refreshButton=document.getElementById("refreshButton");

【讨论】:

我正在摆脱刷新按钮等,因为我希望在找到信号时进行切换。我看到了重组,并为此感谢!我将检查代码是否以这种方式工作,以及何时修复代码中当前存在的错误。 我猜 onconnect 函数应该包含 app.showDetailPage();但这似乎不起作用。我也尝试了代码的连接部分,但这似乎也不起作用。我看到你已经使用了触发onconnect功能的ble.connect,对吗?因为如果那是真的,我认为 app.ShowDetailPage ();应该足够了。 没错,没错 如果我认为您的新结构化代码涵盖了从 refreshdevicelist 到断开功能的旧代码,我是对的吗?因为如果那是真的,我想我可能犯了另一个错误,因此屏幕不会切换 我的代码只涵盖了设备刷新/连接的内容,而您的代码中完全错误

仅当字符串包含匹配项时才替换字符串周围的标签

】仅当字符串包含匹配项时才替换字符串周围的标签【英文标题】:Replacetagssurroundingstringonlyifstringcontainsmatch【发布时间】:2021-10-3106:10:30【问题描述】:我有一个包含许多行的文件,其中包含被标签包围的字符串。<tag:identifi... 查看详情

点击 NavigationBar 和 NavigationBar 项时 UIPopoverController 不会关闭

...:2013-03-1413:19:56【问题描述】:我是ios的新手。我有一个包含多个按钮的导航栏,包括一个后退按钮、排序、过滤器、设置 查看详情

Arraylist.contains 不会检查字符串

】Arraylist.contains不会检查字符串【英文标题】:Arraylist.containswon\'tcheckstring【发布时间】:2015-02-1319:15:21【问题描述】:我想构建一个程序,该程序通过扫描仪输入一组字符串(intT),并将它们存储在数组列表中。然后我想检查输... 查看详情

PyMySQL:当我的列表输入超过一项时收到错误“操作数应包含 1 列”

...PyMySQL:当我的列表输入超过一项时收到错误“操作数应包含1列”【英文标题】:PyMySQL:Receivingtheerror"Operandshouldcontain1column(s)"whenmylistinputsexceedoneitem【发布时间】:2021-10-0211:24:35【问题描述】:我有两个列表,input_algorithm... 查看详情

注入单例依赖项时,HttpContext 为空

...时间】:2021-07-1119:45:27【问题描述】:我希望在我的Blazor应用程序中创建一个全局类,该类包含一个函数,该函数通过我从Windows身份验证获得的用户用户名获取用户的部门,但我似乎无法通过我的全局访问HttpContextAccessor班级。... 查看详情

如何检查字符串是不是已包含 Swift 中的字符 [重复]

...53【问题描述】:如果textField中已有-字符,我想检查我的应用程序。我该怎么做?【问题讨论】:需要更多解释您的问题吗?实际上你想在哪里检查键 查看详情

如何在使用 itertools.groupby 删除重复项时包含每个字符的计数

】如何在使用itertools.groupby删除重复项时包含每个字符的计数【英文标题】:Howtoincludethecountsforeachcharacterwhileremovingtheduplicatesusingitertools.groupby【发布时间】:2017-03-0709:03:41【问题描述】:我有以下代码:df=pd.DataFrame(data=all_r_1.to_d... 查看详情

PHP:检查我的字符串是不是只包含数字和“X”字符

】PHP:检查我的字符串是不是只包含数字和“X”字符【英文标题】:PHP:Checkifmystringonlycontainsnumbersand"X"characterPHP:检查我的字符串是否只包含数字和“X”字符【发布时间】:2017-06-0116:01:13【问题描述】:我检索我的尺寸... 查看详情

获取看起来像包含多个混合词的字符串的记录

】获取看起来像包含多个混合词的字符串的记录【英文标题】:Getrecordsthatlooklikeastringwithseveralmixedwords【发布时间】:2012-12-1410:00:32【问题描述】:数据库类型:MySql假设我的表格中有两行这样的:[1.]“彼得昨天去了公园”[2.]“... 查看详情

如何对包含多个字符串的结构应用基数排序(使用计数排序)

】如何对包含多个字符串的结构应用基数排序(使用计数排序)【英文标题】:Howtoapplyradixsort(usescountingsort)withstructcontainingmultiplestrings【发布时间】:2020-03-0511:33:01【问题描述】:我想用基数排序按字母顺序对结构字符串进行排... 查看详情

python:如何判断列表中的元素是否包含某个数字?(代码片段)

...列表推导,我们通过li的元素,将值转换为str。然后检查字符串中是否为'3'(或您想要的任何值)。此操作的结 查看详情

LINQ,检查此字符是不是包含在我的数据库中的某些表中

】LINQ,检查此字符是不是包含在我的数据库中的某些表中【英文标题】:LINQ,tocheckifthischaracterscontainsinmysometablesinmyDBLINQ,检查此字符是否包含在我的数据库中的某些表中【发布时间】:2021-10-3013:48:24【问题描述】:varunos=newList&l... 查看详情

尝试检查依赖项时 rosdep 出现问题

】尝试检查依赖项时rosdep出现问题【英文标题】:Problemwithrosdepwhentryingtocheckfordependencies【发布时间】:2021-06-2913:31:15【问题描述】:我正在尝试运行以下rosdep命令来检查我的ROS2包中是否缺少依赖项:rosdepinstall-i--from-pathsrc--rosdis... 查看详情

将 UIView (Overlay) 与应用背景混合

...模式)将UIView与我的应用背景混合。但是,要混合的视图包含在复杂的视图层次结构中。可以使用view.layer.compositingFilter="overlayBlendMode& 查看详情

检查列表是不是包含特定字符串,问题[关闭]

】检查列表是不是包含特定字符串,问题[关闭]【英文标题】:CheckifListContainsSpecificString,Problem[closed]检查列表是否包含特定字符串,问题[关闭]【发布时间】:2019-01-0415:13:30【问题描述】:在使用我的SeleniumPython程序时,我试图... 查看详情

li 不会在 IE 中正确浮动

...)。基本上我在一个固定宽度的div中有一个列表。该列表包含没有高度或宽度的li单元格,其中包含一个链接和一个样式化的span标签。li单元格应该向右浮动,span标签相对于&lt;a&gt;向右浮动问题,IE无法处理。而且 查看详情

javascriptxpath命令不会在每次运行时与seleniumjava程序混合运行

...elenium中混合在一起)未成功运行xpath命令每次运行。但是我的Java命令成功运行,这是我遇到问题的xpath。(换句话说,有时xpath命令成功运行,而在其他时候则没有)。我将jdk从13更改为jdk8,但这没有用。我不知道需要什么。我... 查看详情

如何检查数组是不是包含Javascript中的字符串?

】如何检查数组是不是包含Javascript中的字符串?【英文标题】:HowtocheckanarrayifitcontainsastringinJavascript?如何检查数组是否包含Javascript中的字符串?【发布时间】:2013-07-1012:19:37【问题描述】:我有一个包含字符串的数组。varjs_use... 查看详情