0°

ChatGPT 真的是编程好帮手,看我如何几步就实现一个功能

  现在竟然还有人怀疑 ChatGPT 能不能真正帮忙写代码,写的代码会不会 Bug 百出,网上就一张流传很广的搞笑图:

  哈哈,这只是一个梗图,主要问题上面也说了「5分钟出代码」,如果无脑让 ChatGPT 帮忙写代码,自然效果不会太好,如果针对写代码时候碰到一些特定的问题,则绝对比搜索引擎好用,因为 ChatGPT 大语言模型更加理解程序员的需求,并且它还有上下文场景。

  今天我碰到一个 jQuery 的问题,我想在 WordPress 的后台弹窗中显示编辑器,编辑器可以显示,但是编辑器的按钮只显示几个简单的:

  我经过查看源代码,发现 WordPress 在渲染 TinyMCE 的按钮时候提供了 trigger,我可以在此做一些文章:

  $( document ).trigger( ‘wp-before-tinymce-init’, init );

  window.tinymce.init( init );

  直接问 ChatGPT

  作为 PHP 程序员,对 jQuery 不是那么熟悉,我就让 ChatGPT 帮我写这个功能了:

  $( document ).trigger( ‘wp-before-tinymce-init’, init );

  大哥,这里的 init 是对象,可以定义一个 callback 函数改变它的值吗?

  下面是 ChatGPT 也很干脆,直接来:

  是的,您可以在触发 wp-before-tinymce-init 事件之前,定义一个回调函数来修改 init 对象的值。下面是一个示例:

  // 定义一个回调函数,用于修改 init 对象的值

  function modifyInitObject(event, init) {

  // 检查 init 对象是否存在

  if (init) {

  // 修改 init 对象的某个属性或添加新属性

  init.yourProperty = ‘yourValue’;

  // 如果需要修改现有属性,请确保在修改前检查属性是否存在

  if (init.existingProperty) {

  init.existingProperty = ‘new value’;

  }

  }

  }

  // 在触发 ‘wp-before-tinymce-init’ 事件之前,绑定回调函数

  $(document).on(‘wp-before-tinymce-init’, modifyInitObject);

  // 触发 ‘wp-before-tinymce-init’ 事件

  $(document).trigger(‘wp-before-tinymce-init’, init);

  在这个示例中,我们首先定义了一个名为 modifyInitObject 的回调函数,该函数接受事件和 init 对象作为参数。在回调函数中,我们可以修改 init 对象的属性或添加新属性。然后,我们使用 $(document).on() 绑定回调函数,确保在触发 wp-before-tinymce-init 事件时调用该函数。最后,我们触发事件并传递 init 对象。

  这样,当事件被触发时,回调函数将会修改 init 对象的值。

  把代码发给 ChatGPT

  我根据 ChatGPT 的答案,结合自己的业务写好了回调函数,但是发现并不生效,,懒得自己深究了,直接把代码发给 ChatGPT:

  我这样写,貌似不生效,请问大哥有什么问题吗?

  jQuery(function($){

  $(document).on(‘wp-before-tinymce-init’, function(e, init){

  init = $.extend(init, );

  });

  });

  ChatGPT 觉的是我 PHP 输出的不是 JavaScript 对象造成的问题:

  根据您提供的代码,似乎您试图在回调函数中使用 $.extend() 来合并两个对象。您可能希望在 init 对象中添加 tinymce 对象中的属性和值。但是,代码中的问题是,您要合并的对象是直接从 PHP 输出的 JSON 对象,而不是 JavaScript 的对象。

  为了解决此问题,您需要在输出 PHP JSON 对象之前,将其解码为 JavaScript 对象。这是一个修改后的例子:

  $(document).on(‘wp-before-tinymce-init’, function(e, init) {

  // 解码从 PHP 输出的 JSON 对象

  var tinymceObj = JSON.parse(”);

  // 使用 $.extend() 合并 init 和 tinymceObj 对象

  init = $.extend({}, init, tinymceObj);

  });

  在这个修改后的示例中,我们首先使用 JSON.parse() 将从 PHP 输出的 JSON 字符串解码为 JavaScript 对象。然后,我们使用 $.extend() 将 init 和 tinymceObj 对象合并。这样,init 对象应该包含 tinymce 对象中的属性和值。

  请注意,这段代码需要在已经加载 jQuery 的环境中运行。如果您仍然遇到问题,请确保您的页面已经加载了 jQuery,并且没有其他 JavaScript 错误。

  不生效提问 ChatGPT

  我按照他的要求改了,但是还不生效,就继续问:

  大哥,我修改之后还是不生效,可能是什么问题吗?

  ChatGPT 给出了可能出现问题的地方,让我自己尝试去排除:

  如果修改后的代码仍然不生效,那么可能存在其他问题。请尝试以下步骤来诊断和解决问题:

  1. 确保 jQuery 已加载:请确保在执行此代码之前已经加载了 jQuery。您可以在浏览器的控制台输入 jQuery,如果返回一个函数,则说明 jQuery 已加载。

  2. 检查其他 JavaScript 错误:在浏览器的控制台查看是否存在其他 JavaScript 错误。其他错误可能会影响您的代码的执行。

  3. 确保 wp-before-tinymce-init 事件被触发:如果事件没有被触发,回调函数将不会执行。尝试在事件绑定之后立即触发事件,以确认代码正在执行:

  如果您看到控制台输出,那么事件已成功触发并执行了回调函数。

  $(document).on(‘wp-before-tinymce-init’, function(e, init) {

  // …您的代码…

  });

  // 触发事件以测试回调函数是否执行

  $(document).trigger(‘wp-before-tinymce-init’, init);

  4. 检查 init 对象是否正确传递:确保传递给回调函数的 init 对象正确包含您期望的属性和值。在回调函数中输出 init 对象以进行检查。

  5. 确保 PHP 变量 $tinymce 的值正确:在 PHP 代码中检查 $tinymce 变量的值,确保它包含正确的数据。如果可能,请将其值输出到控制台以进行检查。

  6. 代码执行时机问题:确保在 wp-before-tinymce-init 事件触发之前绑定回调函数。如果在事件触发之后绑定回调函数,那么回调函数将不会执行。将代码放在 $(document).ready() 函数中,确保 DOM 完全加载后再执行代码:

  $(document).on(‘wp-before-tinymce-init’, function(e, init) {

  // …您的代码…

  });

  // 触发事件以测试回调函数是否执行

  $(document).trigger(‘wp-before-tinymce-init’, init);

  尝试以上步骤以诊断和解决问题。如果问题仍然存在,请提供更多关于问题的详细信息,以便我们能够更好地帮助您。

  将上下文代码发给 ChatGPT

  我认真看了 ChatGPT 的建议,感觉不是 PHP 输出 JavaScript 对象的问题,我觉得可能是我是 trigger 上下文代码给得太少了,它没理解,所以再把上下文代码发给 ChatGPT:

  大哥,trigger 那边的代码是这样写的:

  $( document ).trigger( ‘wp-before-tinymce-init’, init );

  window.tinymce.init( init );

  果然,这时候 ChatGPT 发现我的代码问题所在了:

  了解了,这样的话,您需要确保您的代码在 $( document ).trigger( ‘wp-before-tinymce-init’, init ); 之前执行。

  首先,您需要将您的回调函数绑定到 wp-before-tinymce-init 事件。然后,当 $( document ).trigger( ‘wp-before-tinymce-init’, init ); 代码执行时,您的回调函数将被调用,并且可以修改 init 对象。

  此外,在您的回调函数中,您需要直接修改传入的 init 对象,而不是创建一个新的对象。这是因为 init 对象是通过引用传递的,所以您需要直接在原始对象上进行修改,以便在后续的 window.tinymce.init(init); 调用中使用修改后的值。

  以下是修改后的代码示例:

  // 将回调函数绑定到 ‘wp-before-tinymce-init’ 事件

  $(document).on(‘wp-before-tinymce-init’, function(e, init) {

  // 解码从 PHP 输出的 JSON 对象

  var tinymceObj = JSON.parse(”);

  // 使用 $.extend() 合并 init 和 tinymceObj 对象

  $.extend(init, tinymceObj); // 注意:这里直接修改 init 对象,而不是创建一个新的对象

  });

  // 在这里触发 ‘wp-before-tinymce-init’ 事件

  $( document ).trigger( ‘wp-before-tinymce-init’, init );

  window.tinymce.init( init );

  请确保将此代码放在 $( document ).trigger( ‘wp-before-tinymce-init’, init ); 之前,以便在触发事件时正确调用回调函数。这样,回调函数将修改 init 对象,然后 window.tinymce.init(init); 调用将使用修改后的 init 对象。

  总结

  所以不要害怕,尝试去问 ChatGPT,它就会尝试给你答案,然后循序渐进缩小范围或者给出具体例子接着去提问,ChatGPT 会结合上下文就能帮你找到真正的问题所在,然后帮你解决。

  如果通过搜索引擎,即使我写出了上面第二步的代码,也很难找到答案,因为搜索引擎是基于关键字的,这里首先我在不知道问题在哪里的时候就很难去定义正确的关键字,可能需要不停的重试,并且搜索引擎没有上下文,所以不管你尝试多少次,都不会对你下一次的搜索有帮助。 而 ChatGPT 就可以根据你的上下文定义出你的问题,给你精准的答案。

  其实我这次问题其实是一个很小的问题,就是 $.extend() 返回的是一个新对象,对于我们这类 PHP 程序员可能要很久才能发现问题所在。那么如果我去搜索引擎搜索的话,因为我根本不知道问题在哪里,我都一开始可能都不知道搜索什么,可能尝试搜索 $.extend(),只有在有人和我发生过同样的问题,并且记录出来,我才会找到答案,这就是搜索引擎长尾关键字的痛苦,搜索的人首先要知道自己搜索什么,而很多人只是有问题,而且是无从下手的问题。

  此外 ChatGPT 提供的代码都有相应的注释,非常利于理解,而且还提供了相关的解释,我好几次使用 ChatGPT 解决问题的时候,顺便还把自己知识的一些盲点都补全了,还修正了一些误区,比如以后我就知道 $.extend() 返回的是一个新对象,如果要修改的是参数,就不能用返回的对象了。

  所以使用 ChatGPT 帮忙写一些功能非常明确的代码是非常好用的,针对迷惑的地方还可以进一步提问,顺便完善我们的编程知识和提供代码能力。

0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论