Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何将e.target传递回服务器_Javascript_Jquery_Node.js_Dom - Fatal编程技术网

Javascript 如何将e.target传递回服务器

Javascript 如何将e.target传递回服务器,javascript,jquery,node.js,dom,Javascript,Jquery,Node.js,Dom,我有一个前端,可以跟踪单击的元素并将其发送回服务器,以便根据该元素的内容在后端执行一些工作。代码是这样设置的 $('body').on('click', function(e) { $.post( '/edit', {el: $( e.target ).serialize()}, function(response) { console.log( response ); }); }); 但是我在服务器上得到el作为一个空字符串。我还可以做些什么将e.target

我有一个前端,可以跟踪单击的元素并将其发送回服务器,以便根据该元素的内容在后端执行一些工作。代码是这样设置的

$('body').on('click', function(e) {
    $.post( '/edit', {el: $( e.target ).serialize()}, function(response) {
        console.log( response );
    });
});
但是我在服务器上得到el作为一个空字符串。我还可以做些什么将e.target信息发送到我的服务器

更新:

我想我的问题可以从一些背景中受益

应用程序的基本功能是启用页内编辑。节点服务器加载我要编辑的HTML页面。单击此页面上的任何元素都可以更改该元素中的文本,然后将其发布回节点服务器,在那里我使用ChereIO模块更改DOM表示并覆盖原始HTML文件。现在,重新加载页面将为我提供页面的新版本,其中包含我所做的编辑

但要应用我在前端所做的编辑,cheerio需要e.target在其DOM表示中找到正确的元素,然后更改文本,因为页面上的许多元素都没有ID

这是整个应用程序

var
    express  = require( 'express' )
,   fs       = require( 'fs' )
,   cheerio  = require( 'cheerio' )
,   $        = ''
,   app      = express()
,   html     = ''
,   injected = "<script> \
                    $( 'body').on( 'click', function(e) {  \
                        $( e.target ).text( prompt('Enter new value:') );  \
                        $.post( '/edit', {el: $(e.target).serialize(), newVal: $(e.target).text()}, function(response) {  \
                            alert( response );  \
                        });  \
                    });  \
                </script>";

app.use( express.static(__dirname) )
app.use( express.bodyParser() )


app.get( '/', function( req, res ) {
    fs.readFile( process.argv[2], 'utf8', function(err, data) {
        $ = cheerio.load( data )
        err? console.log( err ): res.send( data.replace('</body>', injected + '</body>') )
    })
})

app.post( '/edit', function(req,res) {
    $( req.body.el ).text( req.body.newVal )
    fs.writeFile( process.argv[2], $.html(), function(err) {
        err? res.send( err ): res.send( 'file saved with changes!' )
    })
})

app.listen( 8080 )
理论上,这应该允许我在页面中编辑index.html,而无需代码编辑器。但是将e.target完整地返回服务器仍然是一个障碍

解决方法:

我目前的解决方法是使用$'HTML'.HTML发布页面的整个HTML,这样无论单击哪个元素,我都可以获得页面的整体新状态,并使用此新状态覆盖现有文件。但我有一些浏览器扩展,它们注入了自己的HTML/JS,我想避免在保存到文件之前剥离这些HTML/JS的痛苦过程。为此,我需要准确地告诉cheerio单击了哪个元素。

在表单上工作,并生成与查询字符串类似的输出,single=single&multiple=multiple&multiple=Multiple3&check=check2&radio=radio1

您可能需要检查,我使用它在单击按钮时获取按钮的html:

HTML

JS


这取决于您希望在服务器端接收到什么您正在寻找什么?要将表单控件元素转换为字符串名+值,必须序列化哪种类型的数据。e、 目标是一个DOM节点,它是一个对象。既然不能在服务器之间简单地发送这样的对象,那么您到底需要从节点发送什么呢?序列化的DOM元素对您来说是什么样子的?JSON.stringify在提取您需要的道具之后want@FelixKling当然,您的意思是说不能简单地将DOM对象发送到服务器。它为空的原因是您单击的元素没有innerHTML:您怎么知道?无论如何,这是不正确的。如果结果为空,则目标元素既不是表单元素,也不是表单控件元素(如input或select)。谢谢,您撰写评论时我正在编辑
node cms.js "E:\Dropbox\sites\index.html"
<input id="b" type="button" value="click" /> 
$("#b").click (function (e) {
    window.alert($(e.target).outerHTML());
});

jQuery.fn.outerHTML = function(s) {
    return s
        ? this.before(s).remove()
        : jQuery("<p>").append(this.eq(0).clone()).html();
};