我在这个ajax计时器上遇到了问题,它没有做我期望的事情,也没有执行

I am having trouble with this ajax timer it is not doing what I expect and does not execute

提问人: 提问时间:7/27/2021 最后编辑:Martijn Pieters 更新时间:9/5/2021 访问量:227

问:

我又回到了这个不执行我在 php 头的以下 https://deniserose.000webhostapp.com/fetch_sql.php

<head>


<title>Audio Stream</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js">
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
</head>

我在 java 脚本中,我在 php 文件的末尾加载了它

<script src = 'js/fetch_updater.js'></script>

现在这似乎永远不会运行

// Start Clock refresh

// uses new new Ajax.PeriodicalUpdater( 
// in main fetch file to trigger the auto update of the page.
// Written by Denise Rose

var gUpdateDiv="";
var gContentURL="";
var gcheckInterval=0;
var gcheckURL = "";
var gCurrentCheck  ="";





_fetchUpdater('track_data','/fetch_sql.php','/fetch_sql.php',6000);


function _fetchUpdater(updateDiv,contentURL,checkURL,checkInterval)
{
    gUpdateDiv = updateDiv;
    gContentURL = contentURL;
    gcheckInterval = checkInterval;
    gCheckURL = checkURL;
    
    setTimeout('Check();',gcheckInterval);
}

//Called by _fetchUpdater every (n) seconds  determines if content should be updated as page loaded.
function Check()
{
   new Ajax.Request(gCheckURL,{method:'get',  onSuccess:CheckResponse});
   setTimeout('Check();',gcheckInterval);
}



// looks for the response and determines if the div should be updated. 


var openFile = function(event) {
        var input = event.target;

        var reader = new FileReader();
        reader.onload = function(){
          var text = reader.result;
          var node = document.getElementById('output');
          node.innerText = text;
          console.log(reader.result.substring(0, 200));
        };
        reader.readAsText(input.files[0]);
};

function CheckResponse(transport)
{
    var content = transport.response.Text;
    var base64file1 = openFile('/images/nowplaying-artwork_2.png');
    var base64file2 =  $('outerimg').$('#np_track_artwork').src.value;
    
    if(base64file1 != base64file2) {
    
    //if(gCurrentCheck != content) {
       
      gCurrentCheck = content;
       
      new Ajax.Request(gContentUrl, {method: 'get',onSuccess:function t() { 
         $(gUpdateDiv).innerHTML = t.responseText; /*t.response.json()*/}
        
        
      });
      
      $time = new Date().getTime();
      new Ajax.Request('outer_img', {method: 'get',onSuccess:function s() { 
         $('outer_img').innerHTML = "<img id='#np_track_artwork' src='/images/nowplaying_artwork_2.png?t='"+$time+" alt='Playing track artwork' width='200' height='200'>"}
          
      });
           
    }
    //setTimeout('Check();',gcheckInterval);
}

它应该在网站上查看图像/nowplaying_artwork_2.png,并检查它是否与使用 JavaScript 和 ajax 调用的屏幕上的图像相符。我知道目录中的那个正在更改,但据我所知,除非您刷新整个页面,否则它永远不会被激活。使用 crtl +shift I。一定是我做错了什么?但我无法弄清楚为什么它不执行。这是像目录位置一样愚蠢的东西吗?

我在 MIT Prototype JavaScript 框架 1.7.2 版中收到此错误

  • (c) 2005-2010 山姆·斯蒂芬森

这是[违规]“setTimeout”处理程序需要 296299ms 原型.js

  function delay(timeout) {
    var __method = this, args = slice.call(arguments, 1);
    timeout = timeout * 1000;
    return window.setTimeout(function() {
      return __method.apply(__method, args);
    }, timeout);
  }

我查看了代码检查。它确实运行 CheckResponse(),它需要与 SetTimeout() 不同,它是非推断的,任何人都可以提供帮助,因为它没有进一步发展,它可能是我的 base64 的东西,但需要帮助?我的读取 javacode 可能不起作用吗?

记者说这可能是使用了 SetTimeout(),但 SetTimout() 在清除后会被调用以更新计时器,所以这不可能是问题所在,而且仍然不知道为什么它不起作用。

我今天有更多的时间,所以用 Ctrl = Shift+I 进行了检查

我可以看到检查响应触发 https://i.gyazo.com/f4f0a3ea8a9fcddd864b420ddadddb21.png 正常。因此,它一定没有正确阅读图像,我使用了这个网站上的图像,我并不感到惊讶它没有工作,我确实发布了一个帖子,但没有人回答它并提供工作结果 从 DIV 中的网页 <img> 和 JavaScript 中的文件获取 base64_decode($artwork) 并进行比较

我已经尝试了几个版本,所有版本都不起作用,因为我所做的PHP版本是我正在寻找的是:

function OpenFileOrig() {

    $r = fopen('images/nowplaying_artwork_2.png', 'wb');
        if ($r !== false) {
             fread($r,base64);
             if (base64) base64 = base64_encode(base64);
    } else fclose($r);
      
    
    
}

我也试过了

 var openFile = function(file) {
    var input = file.target; 

    var reader = new FileReader(); 
    reader.readAsArrayBuffer(file);
  };

const getBlobFromUrl = (myImageUrl) => {
    return new Promise((resolve, reject) => {
        let request = new XMLHttpRequest();
        request.open('GET', myImageUrl, true);
        request.responseType = 'blob';
        request.onload = () => {
            resolve(request.response);
        };
        request.onerror = reject;
        request.send();
    });
};
const getDataFromBlob = (myBlob) => {
    return new Promise((resolve, reject) => {
        let reader = new FileReader();
        reader.onload = () => {
            resolve(reader.result);
        };
        reader.onerror = reject;
        reader.readAsDataURL(myBlob);
    });
}
const convertUrlToImageData = async (myImageUrl) => {
    try {
        let myBlob = await getBlobFromUrl(myImageUrl);
        console.log(myBlob);
        let myImageData = await getDataFromBlob(myBlob);
        console.log(myImageData);
        return myImageData;
    } catch (err) {
        console.log(err);
        return null;
    }
};

两者似乎都不起作用 这将在 JavaScript 中运行 此外,它可以显示它在这里走了多远 https://i.gyazo.com/77c16c54f9cb91e1f1ef8be0d4fc7589.png 为什么 Stack Overflow 上的这些读取例程不起作用作为答案?

另外,您可以在此处看到调试器只会在一个地方停止 https://i.gyazo.com/ade6187a03d5faa53a8c0237680086b4.png 即使我通过右键单击断点使用“继续到此处”,它也不会转到下一个断点,这是计时器在执行代码之前跳出的问题吗?

我还通过打开的图像运行了它,jpg显示了它似乎没有获取url的位置,调试器标记在下面的intalic中,如图 https://i.gyazo.com/3e1e74503d4e3676b67606eff0012570.png 所示

var openFile = function(file) { *file = "/images/nowplaying_artwork_2"*

 var input = file.target; *input = undefined*

var reader = new FileReader(); *reader = FileReader{readystate:0, result:null, error: null,onloadstart=null,onprogress:null...}*

我将打开的文件更改为此文件,因为它更具可读性并在文件中获取了 url


function openFile(file) {
    var input = file; // file.target removed as not passing url

    var reader = new FileReader();
    reader.readAsArrayBuffer(file);
  };

它仍然没有读取文件,给出异常

好的,所以一直在寻找

它在 [prototype.js][1] 中的捕获 (e) 'this.dispatchException(e);' 下给出了异常:

  respondToReadyState: function(readyState) {
    var state = Ajax.Request.Events[readyState], response = new Ajax.Response(this);

    if (state == 'Complete') {
      try {
        this._complete = true;
        (this.options['on' + response.status]
         || this.options['on' + (this.success() ? 'Success' : 'Failure')]
         || Prototype.emptyFunction)(response, response.headerJSON);
      } catch (e) {
        this.dispatchException(e);
      }

当我运行时$r = fopen('/images/nowplaying_artwork_2.png', 'wb');

尝试

function openFileOrig() {
   var base64; 
   var r;
   try {
       r = fopen('/images/nowplaying_artwork_2.png', 'wb');
        if (r !== false) {
             fread(r,base64);
             if (base64) base64 = base64_encode(base64);
        }
      
    } catch (err) {
       if(r) fclose($r);
       console.log(err);
       return null;
    }
    
}

所以我现在在运行 Perfomance 工具时收到一条消息,即 openfil 未在 openFileOrig 中定义,这要好得多,因为它提供了更好的提示,但奇怪的 https://www.careerride.com/JScript-read-and-write-file.aspx 但这里有一个更好的答案,谷歌列表中的 Stack Overflow 条目没有显示此 https://www.codeproject.com/Questions/399116/Javascript-read-data-froma-txt-file

因此,由于在我的书 JavaScript 1.1 中,JavaScript 中可用的原始文件命令现在都不可用,因此我回到了原始的函数读取器

function openFileOrig2(file) {
   var base64; 
   var r;
   var img_src;
   
   try {
        const reader = new FileReader();
        reader.addEventListener('load', (event) => {
          img_src = event.target.result;
          // We do something
          if (img_src) base64 = base64_encode(img_src);
        });
        
       reader.addEventListener('progress', (event) => {
       if (event.loaded && event.total) {
          const percent = (event.loaded / event.total) * 100;
          console.log(`Progress: ${Math.round(percent)}`);
       }});
       reader.readAsDataURL(file);
    } catch (err) {
    
       console.log(err);
       return null;
    }
}

让我们看看它按预期做了什么,它给出了一个 blob 错误

我接下来试过了

var openFile = function(event) {
    var input = event.target;

    try {
       var reader = new FileReader();
        reader.onload = function(){
          var img_src = reader.result;
          // We do something
          if (img_src) base64 = base64_encode(img_src);

        };
        reader.readAsDataUrl(input.target);
    } catch (err) {
            console.log(err);
            return null;
    }    
};

但是根据控制台中记录的错误,reader.readAsDataUrl 不再是函数,这是不正确的信息。

“javascripture.com/FileReader”和误导性 我已经编写并报告了此错误并键入错误:reader.readASDataUrl javascripture.com 这不是 Chrome 浏览器中的函数。

现在它说输入一不是斑点?那这是什么:

    var FILE = new Blob();
    FILE.target = '/images/nowplaying_artwork_2.png';
    FILE.files = FILE.target;
    var base64file1 = openFile(FILE);

我从另一个关于Stack Overflow问题和答案的示例中再次尝试27251953但将其包装在错误检查器中。这也失败了“ReferenceError: blob is not defined”

如果 Stack Overflow 不再起作用,为什么所有这些东西都在 Stack Overflow 上?

    try {
        var file = new File([blob], "/images/nowplaying_artwork_2.png",{type:"image/png", lastModified:new Date().getTime()})
    } catch (err) {
            console.log(err);
            return null;

问题仍然存在,blob 无法解决好吧,它在 StackOverflow 片段运行器上有效,我可以问为什么它在 000WebHostApp 上不起作用,版主再次说,在这里问。这是因为它需要节点.js吗?还是别的什么?

**更新** 我在这里解决了图像更新的问题 从 DIV 中的网页 <img> 和 JavaScript 中的文件获取 base64_decode($artwork) 并进行比较。但是,我们留下了不刷新的文本。它看到我可以做到这一点的唯一方法是在另一个文件中创建表create_sql_div.php该文件仅创建了表。它看到我必须找到一种方法来更新innerHTML。我不确定如何从 javascript 将其放入主页,但当我有时间查看它时会再次发布。但是,我确实试探性地尝试了document.querySelector('#np_track_text').innerHTML='/create_sql_div.php';但我不认为它会将 URL 加载到可以填充 div 的表单中?

我试过了

function updateTextDisplay() {
   // document.querySelector('#np_track_text').load('/create_sql_div.php');
   //     document.getElementById('#np_track_text').redraw;
   var client = new XMLHttpRequest();
   client.open('GET','/create_sql_div.php');
   client.onreadystatechange = function() {
       document.querySelector('#np_track_text').innerHTML = client.responseText;
   };
   client.send;
   
}

我切换到这个 Ajax 调用,因为他们以前工作过,但仍然没有错误,也没有 html 更改

function updateTextDisplay() {
   // document.querySelector('#np_track_text').load('/create_sql_div.php');
   //    
   new Ajax.Request('/create_sql_div.php', {method: 'get',onSuccess:function t() { 
         document.querySelector('#np_track_text').innerHTML = t.responseXML;
         document.querySelector('#np_track_text').redraw;
        }
   });
   
}

它给出错误“未捕获的语法错误:输入意外结束”有谁知道这意味着什么,因为谷歌是模糊的这个文件可以在浏览器中打开而不会出错,所以为什么会说这个错误?

复制错误的步骤显然,复制此错误的步骤很容易遵循:1)加载网站 deniserose.000webhostapp.com/fetch_sql.php 等待至少6000毫秒 2)您将看到底部部分变为“未定义”,获取源副本 3)刷新页面,它将返回,完成,获取源副本。4)使用 www.diffchecker.com 此声明“两个文件相同”来比较两个来源,在这种情况下,这里出了什么问题?

好的,我有答案

最后,对 t.responseText 的引用是错误的,这应该是 t.arguments[0].t.responseText ;也不是 t.responseXML 。哈哈,我在 Google 调试器变量中找到了它,所以一切都很好,我希望 D 拥抱

@enhzflep 我无法打开新问题,所以我正在添加这个问题,我在使用 SQL phpMyAdmin 时遇到错误

create function SPLITSTRING (@String AS VARCHAR(256)) RETURNS VARCHAR(256) AS (
SELECT `genre` LEFT(@String, CHARINDEX(';',@String +';'-1),STUFF(@String,1,CHARINDEX(';',@String + ';','') FROM`played_songs` UNION ALL
SELECT  `genre` LEFT(@String, CHARINDEX(';',@String +';'-1),STUFF(@String,1,CHARINDEX(';',@String + ';','') FROM`played_songs` FROM SPLIT_STRING WHERE @String >'' 
  )                                                             
SELECT `genre` FROM SPLIT_STRING ORDER BY `genre` ASC       

它报告静态分析:

分析过程中发现 1 个错误。

无法识别的数据类型。(靠近位置 37 的“AS”)知道为什么?

JavaScript PHP jQuery AJAX 错误处理

评论

0赞 David 7/27/2021
浏览器的开发控制台上是否有任何错误?当您使用浏览器的脚本调试器在代码执行时单步执行代码时,具体会发生什么情况?
1赞 epascarello 7/27/2021
onSuccess:'CheckResponse()'应该可能是和注意和onSuccess:checkResponsecC
1赞 Patrick Evans 7/27/2021
你有,但你的函数是,你也应该只传递函数引用作为值而不是字符串,例如onSuccess:'CheckResponse()'function checkResponseonSuccess:checkResponse}
0赞 Reporter 7/27/2021
@virtualKitten呃,你确定要使用 instaed of 吗?setTimeout()setInterval()
0赞 8/2/2021
不,第一个计时器检查页面是否已加载并在加载时报告,第二个检查响应计时器查看服务器和页面上的图像并进行比较,如果没有,则推送新图像。

答: 暂无答案